Amo*_*ngh 5 c pointers multidimensional-array
我有一个关于二维数组的程序
基地是
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;
}
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
将分别为&arr+1和的十进制偏移量arr+1.这是我刚刚进行的测试运行的输出:
36
12
Run Code Online (Sandbox Code Playgroud)
36匹配:3行×3列×每个条目4个字节= 36个字节.那么12:1行×3列×每个条目4个字节= 12个字节.
注意 - 你也在使用打印指针%d,这是错误的.你可能应该用%p它.