int a[20];
假设内存中[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)
(以上“=”表示“相等”)
是吗?
答案 0 :(得分:7)
严格地说,答案是行为未定义。
&a
是数组的地址。将1
添加到地址(指针值)会使其增加所指向类型的大小。但是,当结果指向与原始指针相同的数组的元素时,或仅仅超过它的结尾时,指针算法仅对有效。 (出于指针运算的目的,单个对象被视为一个元素的数组。)
如果你假设某个“表现良好”的内存模型,只有一个线性单片寻址空间和与整数明显相关的地址,那么给定你的假设(&a
为100, sizeof (int) == 4
),然后是,&a + 4
的结果为420
。更准确地说,由于420
是一个整数,而不是一个指针,它将是(int(*)[10])420
- 再次,假设指针和整数之间的转换表现得特别好。
答案 1 :(得分:5)
&a
是指向具有20个元素的int数组的指针(类型为int (*)[20]
)。
因此&a + 4
与a + 4
不同,因为在第二个表达式a
中求值为指向第一个元素的指针(它计算为类型为int*
的指针)。指针算法的工作方式不同,因为指针类型不同,即使&a
和a
的值相同。
答案 2 :(得分:3)
因为a的大小是数组的大小,即80字节。所以4 * 80 = 320 +基地址100 = 420。
当你添加到指针时,它会为每个尺寸添加你指向的东西的整个尺寸。
所以,是的。你是对的。