4
int a[20];

假设a[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)

(上面的“=”表示“相等”)

那正确吗?

4

3 回答 3

7

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

&a是数组的地址。添加1到一个地址(指针值)后,它会按它所指向的类型的大小前进。但是指针运算在结果指向与原始指针相同的数组的元素时才有效,或者刚刚超过它的末尾。(出于指针算术的目的,单个对象被视为一个元素的数组。)

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

于 2013-06-22T07:15:51.507 回答
5

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

So&a + 4不同于a + 4因为在第二个表达式中a计算为指向第一个元素的指针(它计算为 type 的指针int*)。由于指针类型不同,即使&a和的值a相同,指针运算的结果也不同。

于 2013-06-22T07:08:04.477 回答
3

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

当您添加到指针时,它会为每个大小添加您指向的事物的整个大小。

所以,是的。你是对的。

于 2013-06-22T07:02:22.093 回答