数组和数组名的C程序地址增量

数组和数组名的C程序地址增量,c,arrays,memory-address,C,Arrays,Memory Address,对于这段代码,GCC编译器返回 int arr[10]={1,2,3,4,5,6,7,8,9,10}; printf("%p,%p\n", arr, &arr); printf("%p,%p\n", arr+1, &arr+1); return 0; 第一行很清楚,没问题。但是第二行让我感到困惑。第一个地址移动到下一个int,因此在arr之后是4个字节,清除。但是,对于&arr+1我认为它将指向整个数组的末尾arr[10],因此它应该向地址添加4*10。我误解了什么吗?类型的&

对于这段代码,GCC编译器返回

int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%p,%p\n", arr, &arr);
printf("%p,%p\n", arr+1, &arr+1);
return 0;

第一行很清楚,没问题。但是第二行让我感到困惑。第一个地址移动到下一个
int
,因此在
arr
之后是4个字节,清除。但是,对于
&arr+1
我认为它将指向整个数组的末尾
arr[10]
,因此它应该向地址添加4*10。我误解了什么吗?

类型的
&arr
是“指向10的数组的指针
int
”。因此,当您向它添加一个(
&arr+1
)时,它会移动到下一个10
int
数组的开头,这比您认为正确的
&arr

数组的开头多了40个字节,并且只能这样做

由于
&arr
=>
0xbfe41348

0xbfe41348
+
0x28
4*10
十进制)=
0xbfe41370

我想你是因为在十六进制数上加了十进制而弄糊涂了

0xbfe41348,0xbfe41348
0xbfe4134c,0xbfe41370
这里,arr是指向整数数组的基指针,因此结果将递增
sizeof(int)


这里
&arr
产生数组的地址,因此结果随数组大小递增。

&arr+1
实际上会将
40
添加到数组的基址
arr
,但这并不明显,因为地址是十六进制或十六进制,而不是十进制

现在,不管它值多少钱,我将对每一条语句添加一些解释,以使事情变得清楚

&arr+1
上述语句将
arr
定义为
int[10]
类型,即
10
整数数组。然后使用数组初始化器列表初始化
arr

int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
在上面的语句中,
arr
衰减(计算或隐式转换)为指向其第一个元素的指针。因此它的类型是
int*
&arr
计算为指向
arr
的指针。
arr
的类型为
int[10]
。因此,
&arr
的类型是
int(*)[10]
,即指向10个整数数组的指针。之所以使用括号,是因为数组下标运算符
[]
的优先级高于
*
运算符。因此,不带括号的
int*[10]
表示一个由10个指向整数的指针组成的数组。这是数组不会衰减为指向其第一个元素的指针的情况之一

请注意,
arr
&arr
的计算值相同,即上述
printf
语句中数组的基址,但它们的类型不同,指针算法也不同。这在下面的陈述中显示出来-

printf("%p,%p\n", arr, &arr);
arr+1
指向下一个元素。这里的元素类型是
int
。因此
arr+1
的计算结果为

printf("%p,%p\n", arr+1, &arr+1);
&arr+1
也指向下一个元素,但这里的元素类型是
int[10]
——一个由10个
整数组成的数组。因此
&arr+1
的计算结果为

arr + (1 * sizeof(int)) 

哦,天哪,我忘了是六边形。。。多么愚蠢的错误!谢谢你的提示。我不明白为什么像这样的答案(没有添加任何内容,只是重新措辞了问题主体中已经存在的内容)会得到这么多的赞成票。Stack Overflow上的一些人是否有粉丝追随他们,对他们所写的任何东西都给予赞誉?@ThoAppelsin这些重新措辞有时可能会很糟糕!!!(我现在明白了)因素:)@mudasserhussain绝对不是在这种情况下,网络摇滚已经明确表示他/她希望在地址中添加40个。可能只是从来没有在任何情况下,谁问的人使用自己的真话;只有当提问的人使用了他尚未正确理解的引用解释时,重新措辞才可能有用。这里不是这样,这里没有任何引用的解释。看,它应该解释。非常感谢你的解释,我现在更清楚了。因为我在数据格式上犯了一个错误,并且被接受的答案指出了这一点,所以我选择了它。但还是非常感谢你。
arr + (1 * sizeof(int)) 
arr + (1 * sizeof(int[10]))