请解释一下差异

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

Car*_*rum 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);
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它.

  • 我从你的答案中学到了很多东西.谢谢. (2认同)