请解释一下差异
我有一个关于二维数组的程序
基地址是
8678
#include #include main() { int arr[3][3]={ {83,8,43}, {73,45,6}, {34,67,9} }; printf("%d ",&arr+1); //points to 8696 printf("%d ",arr+1); //points to 8684 return 0; }
arr+1
和&arr+1
什么区别?
嗯,他们是不同的东西。 arr
在大多数上下文中衰减为指向数组第一个元素的指针 – 这意味着指向2D数组中第一个3元素行的指针:type int (*)[3]
。 然后, arr + 1
指向数组中的第二行。
&arr
是数组本身的地址(类型为int (*)[3][3]
),因此&arr + 1
指向整个2D数组末尾的内存。
您可以通过不同的打印轻松确认此行为。 具体来说,将偏移量打印到新指针而不是值本身将有助于清除事物。 来自这些打印语句的程序输出:
printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr); printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr);
将是&arr+1
和arr+1
的十进制偏移量。 这是我刚刚进行的测试运行的输出:
36 12
36匹配:3行×3列×每个条目4个字节= 36个字节。 那么12:1行×3列×每个条目4个字节= 12个字节。
注意 – 您还使用%d
打印指针,这是错误的。 您可能应该使用%p
。
你可以借助这个等价来解决这个问题:X [Y] === *(X + Y)
由于*(arr + 1)=== arr [1],arr + 1 ===&arr [1]
同样,&arr + 1 ===&((&arr)[1])
什么是(&arr)[1]? 那么,(&arr)[0] === *&arr === arr,也就是说,3×3数组本身,所以(&arr)[1]是跟随它的3×3数组,而&arr + 1 ===&(( &arr)[1])是跟随&arr …的3×3数组的地址…指向刚好超过整个数组的字节的指针。
Arr + 1给出数组中的下一个元素,而&arr + 1给出下一个整数数组的地址
array + 1表示数组[1]的地址,它需要3 int内存。
&array + 1表示array [0]的地址加1;