i have a program about 2-D arrays
base adress is
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;
}
what is the difference between
arr+1
and&arr+1
?
最佳答案
嗯,它们是不同的东西。 arr
在大多数上下文中衰减为指向数组第一个元素的指针 - 这意味着指向二维数组中第一个 3 元素行的指针:类型 int (*)[3]
。 arr + 1
,则指向数组的第二行。
&arr
是数组本身的地址(类型int (*)[3][3]
),所以&arr + 1
指向刚好超过整个二维数组末尾的内存。
您可以通过不同的打印方式轻松确认此行为。具体来说,将偏移量打印到新指针而不是值本身将有助于解决问题。这些打印语句的程序输出:
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
。
关于c - 请解释区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11857698/