c语言中指针(地址)加法与减法
在c语言中:
unsigned char *p;
p++;//表示p指向的地址增加1
unsigned int *p;
p++;//表示p指向的地址增加4
struct student
{
unsigned char gender;
unsigned int id;
unsigned int age;
unsigned char name[21];
unsigned int weight;
};
sizeof(struct student) = 40;//按4字节对齐
struct student *p;
p++;//表示p指向的地址增加40
在c语言标准中,加法与减法运算对于地址的操作和对于值的操作是不同的。
当一个加法运算,加号左边的操作数一个是指针,右边是一个整数时,这个整数值先乘以指针指向的数据类型的大小(如sizeof(int)),然后再和指针的值相加。
当一个减法运算,减号左边的操作数是一个指针,右边是一个整数时,这个整数值先乘以指针指向的数据类型的大小(如sizeof(int)),然后再被指针的值减去。
当一个减法运算,减号两边的操作数都是地址时,则这两个地址的数据类型必须一致(如都是int *类型),否则无法通过编译。减法运算的结果为地址值的差,再除以该地址的数据类型的大小(如sizeof(int))。
示例:
#include <stdio.h>
struct student
{
unsigned char gender;
unsigned int id;
unsigned int age;
unsigned char name[21];
unsigned int weight;
};
unsigned char arr_char[20];
unsigned int arr_int[20];
struct student stu;
struct student stu2[7];
void main()
{
unsigned char *p_char = arr_char;
unsigned int *p_int = arr_int;
unsigned int addr = 0;
printf("p_char = %p\n", p_char);
printf("p_char + 1 = %p\n", p_char + 1);
printf("p_int = %p\n", p_int);
printf("p_int + 1 = %p\n", p_int + 1);
printf("\n");
printf("sizeof(stu) = %#x\n", sizeof(struct student));
printf("stu = %p\n", &stu);
printf("stu + 1 = %p\n", &stu + 1);
printf("\n");
printf("gender_addr = %p\n", &stu.gender);
printf("id_addr = %p\n", &stu.id);
printf("age_addr = %p\n", &stu.age);
printf("name_addr = %p\n", &stu.name);
printf("weight_addr = %p\n", &stu.weight);
printf("\n");
addr = (unsigned int)&stu;
printf("addr = %#x\n", addr);
printf("addr + 1 = %#x\n", addr + 1);
printf("\n");
p_char = (unsigned char *)&stu;
printf("p_char = %p\n", p_char);
printf("p_char + 1 = %p\n", p_char + 1);
printf("\n");
printf("stu2 - stu1 = %#x\n", &stu2[7] - &stu2[2]);
printf("stu2 - stu1 = %#x\n", &arr_int[5] - &arr_int[2]);
}
运行结果:
p_char = 0x804a068
p_char + 1 = 0x804a069
p_int = 0x804a1a0
p_int + 1 = 0x804a1a4
sizeof(stu) = 0x28
stu = 0x804a040
stu + 1 = 0x804a068
gender_addr = 0x804a040
id_addr = 0x804a044
age_addr = 0x804a048
name_addr = 0x804a04c
weight_addr = 0x804a064
addr = 0x804a040
addr + 1 = 0x804a041
p_char = 0x804a040
p_char + 1 = 0x804a041
stu2 - stu1 = 0x5
stu2 - stu1 = 0x3

浙公网安备 33010602011771号