在[a] [20]中,“& a + 4”的答案是什么?

时间:2013-06-22 06:58:42

标签: c arrays pointers

int a[20];

假设内存中[20]的地址为100. int的大小为4。 很容易知道a = 100, &a = 100, &a[4] = 116。 但是当我尝试(& a + 4)时,答案是420(我在GCC,DEV-C,VC中测试过它) 我想&a + 4 = 420420 = 100 + 4 * sizeof (a[20]) = 100 + 4*(4*20)

的原因

(以上“=”表示“相等”)

是吗?

3 个答案:

答案 0 :(得分:7)

严格地说,答案是行为未定义。

&a是数组的地址。将1添加到地址(指针值)会使其增加所指向类型的大小。但是,当结果指向与原始指针相同的数组的元素时,或仅仅超过它的结尾时,指针算法仅对有效。 (出于指针运算的目的,单个对象被视为一个元素的数组。)

如果你假设某个“表现良好”的内存模型,只有一个线性单片寻址空间和与整数明显相关的地址,那么给定你的假设(&a为100, sizeof (int) == 4),然后是,&a + 4的结果为420。更准确地说,由于420是一个整数,而不是一个指针,它将是(int(*)[10])420 - 再次,假设指针和整数之间的转换表现得特别好。

答案 1 :(得分:5)

&a是指向具有20个元素的int数组的指针(类型为int (*)[20])。

因此&a + 4a + 4不同,因为在第二个表达式a中求值为指向第一个元素的指针(它计算为类型为int*的指针)。指针算法的工作方式不同,因为指针类型不同,即使&aa的值相同。

答案 2 :(得分:3)

因为a的大小是数组的大小,即80字节。所以4 * 80 = 320 +基地址100 = 420。

当你添加到指针时,它会为每个尺寸添加你指向的东西的整个尺寸。

所以,是的。你是对的。