c - 请解释区别

标签 c pointers multidimensional-array

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+1arr+1 的十进制偏移量。这是我刚刚进行的测试运行的输出:

36
12

36 个匹配项:3 行 × 3 列 × 每个条目 4 个字节 = 36 个字节。 12也是这样:1行×3列×每个条目4字节=12字节。

注意 - 您还使用 %d 打印指针,这是错误的。您可能应该为此使用 %p

关于c - 请解释区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11857698/

相关文章:

c - 如果我在 c 中声明一个接受变量/数组地址的函数,它应该只适用于传递地址。为什么它也适用于常量?

c - 提高效率 "lighthouse"

c - 为什么 (*p=*p) & (*q=*q);在 C 中触发未定义的行为

c++ - 指向数组元素的指针打印内存地址而不是元素的值

algorithm - 如何在二维数组中进行交叉——遗传算法

c++ - C/C++ - 对其他人隐藏 C 或 C++ 函数代码

json - Q : golang pointer to map[string]interface{}

c - 在下面的代码中,*ptr 如何与 (.) 一起使用以及 (&test) 与 -> 一起使用?

ruby - 如何在 Ruby 中正确访问和迭代多维数组?

c - 具有较大数组的 memcpy 段错误