请解释一下差异

我有一个关于二维数组的程序

基地址是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+1arr+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;