我有一个关于二维数组的程序
基地址是
8678
#include<stdio.h>
#include<conio.h>
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
之间有什么区别?
答案 0 :(得分:9)
嗯,他们是不同的东西。 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
。
答案 1 :(得分:1)
你可以借助这个等价来解决这个问题:X [Y] === *(X + Y)
由于*(arr + 1)=== arr [1],arr + 1 ===&amp; arr [1]
同样,&amp; arr + 1 ===&amp;((&amp; arr)[1])
什么是(&amp; arr)[1]?好吧,(&amp; arr)[0] === *&amp; arr === arr, 也就是说,3x3阵列本身,所以(&amp; arr)[1]是之后的3x3阵列, 和&amp; arr + 1 ===&amp;((&amp; arr)[1])是跟随&amp; arr ...的3x3数组的地址...指向刚好超过整个数组的字节的指针。
答案 2 :(得分:0)
Arr + 1给出数组中的下一个元素,而&amp; arr +1给出下一个整数数组的地址
答案 3 :(得分:-1)
array + 1表示数组[1]的地址,它的成本为3 int。
&amp; array + 1表示array [0]的地址加1;