数组和数组名的C程序地址增量
对于这段代码,GCC编译器返回数组和数组名的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。我误解了什么吗?类型的&
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
)时,它会移动到下一个10int
数组的开头,这比您认为正确的&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]))