我有一个关于二维数组的程序
基地址是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
and &arr+1
?
嗯,它们是不同的东西。arr
在大多数情况下衰减为指向数组第一个元素的指针 - 这意味着指向 2D 数组中第一个 3 元素行的指针: typeint (*)[3]
. arr + 1
,则指向数组中的第二行。
&arr
是数组本身的地址(类型int (*)[3][3]
), so &arr + 1
指向刚刚过去整个二维数组末尾的内存。
您可以通过不同的打印方式轻松确认此行为。具体来说,打印新指针的偏移量而不是值本身将有助于澄清问题。这些打印语句的程序输出:
printf("%ld\n",(intptr_t)(&arr+1) - (intptr_t)arr);
printf("%ld\n",(intptr_t)(arr+1) - (intptr_t)arr);
将是小数偏移量&arr+1
and arr+1
分别。这是我刚刚进行的测试运行的输出:
36
12
36 匹配:3 行 × 3 列 × 每个条目 4 字节 = 36 字节。 12 也是如此:1 行 × 3 列 × 每个条目 4 字节 = 12 字节。
注意 - 您还使用打印指针%d
,这是错误的。你可能应该使用%p
为了那个原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)