int a[20];
假设a[20]在内存中的地址是100。int的大小是4。很容易知道a = 100, &a = 100, &a[4] = 116
。但是当我尝试 (&a + 4) 时,答案是 420(我已经在 GCC、DEV-C、VC 中测试过)我猜原因&a + 4 = 420
是420 = 100 + 4 * sizeof (a[20]) = 100 + 4*(4*20)
(上面的“=”表示“相等”)
那正确吗?
严格来说,答案是行为未定义。
&a
是数组的地址。添加1
到一个地址(指针值)后,它会按它所指向的类型的大小前进。但是指针运算仅在结果指向与原始指针相同的数组的元素时才有效,或者刚刚超过它的末尾。(出于指针算术的目的,单个对象被视为一个元素的数组。)
如果您假设某个“行为良好”的内存模型,具有单个线性单片寻址空间和与整数明显相关的地址,那么给定您的假设(&a
是 100,sizeof (int) == 4
),那么是的,结果&a + 4
将是420
。更准确地说,因为420
是一个整数,而不是一个指针,所以它会(int(*)[10])420
- 再次假设指针和整数之间的转换表现得特别好。
&a
是指向具有 20 个元素的 int 数组的指针(类型为int (*)[20]
)。
So&a + 4
不同于a + 4
因为在第二个表达式中a
计算为指向第一个元素的指针(它计算为 type 的指针int*
)。由于指针类型不同,即使&a
和的值a
相同,指针运算的结果也不同。
因为a的大小就是数组的大小,也就是80字节。所以 4 * 80 = 320 + 100 的基地址 = 420。
当您添加到指针时,它会为每个大小添加您指向的事物的整个大小。
所以,是的。你是对的。