请问在种有关地址的运算怎么算?(语言-c语言)
这种类型的一直不会,求解答
b = a + 5; a 是数组a[10]首地址,a+5 是数组第5个元素的地址即 b = &a[5], b[-1] ===> b - 1 = a + 5 - 1 = a + 4 = &a[4],b[-1] = a[4] = 5
p = (int*)(&a + 1); &a是数组指针,其类型为int(*)[10]; 而指针 + 1要根据指针类型加上一定的值,不同类型的指针 + 1之后增加的大小不同,a是长度为10的int数组指针,所以要加10*sizeof(int),所以p实际是a[10], 但是p与(&a + 1)类型是不一样的,这点非常重要,所以p - 2只会减去2*sizeof(int*),所以*(p-2) 最终为 a[8] = 9。
a,&a的地址是一样的,但所代表的意思是不一样的,a是数组首地址,也就是a[0]的地址 。&a是对象(数组)首地址,&a + 1是下一个对象的地址,即a[10]。
以下答案由GPT-4.0Plus大模型与博主A努力中.......共同编写:
在C语言中,可以通过指针进行地址运算。主要有以下几种:
c
int *ptr = 0x10; //ptr指向地址0x10
ptr + 1; //0x14,int为4字节,所以增加1个int的长度
ptr + 5; //0x28,增加5个int的长度
c
int *ptr = 0x28;
ptr - 1; //0x24
ptr - 5; //0x10
c
int *ptr1 = 0x10;
int *ptr2 = 0x28;
ptr1 - ptr2; //-5,0x10到0x28有5个int的长度
c
int *ptr = 0x10;
ptr + 5; //0x28
5 + ptr; //0x28
ptr - 2; //0x1C
所以,在C语言中可以通过指针和整数的加减法进行地址运算,主要用于遍历数组、操作字符串等。