如果a是一个int数组,
(char*) &a[1] - (char *)&a[0]
等于4,而&a[1] - &a[0]
等于1。为什么会这样呢?(char*) &a[1] - (char *)&a[0]
等于4,而&a[1] - &a[0]
等于1。为什么会这样呢?int array[10] ;
int * p = array ;
p ++ ;
我希望p
指向第二个整数,而不是在两个元素之间的某个内存处。
因此,&a[1]
与&a[0]
相距四个字节,但是询问它&a[1] - &a[0]
会问有多少个int
之间的距离。当你将它转换为char
时,你要求用char
的大小来计算数学。
时
&a[1] - &a[0]
由于a是一个整型数组,会隐式地假定为int*类型的指针,也就是说
(int *)&a[1] - (int *)&a[0]
但是当您进行以下操作时-
(char*) &a[1] - (char *)&a[2]
int a[25] ;
int *i_ptr = a;
printf("address of 1st element %d\n", a);
printf("address of 1st element %d\n", &a[0]);
// address of first element + sizeof(int)
printf("address of 2nd element %d\n", a+1);
// address of first element + sizeof(int)
printf("address of 2nd element %d\n", &a[1]);
// this one is tricky
// address of first element + sizeof(25*int) ie sizeof(the whole array)
printf("address of JUST AFTER THE ARRAY %d\n", &a+1);
最后一个问题非常棘手,大多数程序员甚至不知道它的存在。虽然 a 指向数组的第一个元素,并且具有数组元素的类型,但 &a 则完全不同。它还保留了数组第一个元素(即数组开头)的地址,但其类型不同,表明编译器对其进行指针算术运算时将基于数组大小而不是元素大小。
给出:
address of 1st element 2881388 +0
address of 1st element 2881388 +0
address of 2nd element 2881392 +4
address of 2nd element 2881392 +4
address of JUST AFTER THE ARRAY 2881488 +100