我理解 *(p+i( 的工作原理,但是,当通过 printf(( 函数使用 *(p-i( 或 p[-i] 检索值时,内存级别实际上发生了什么?
#include <stdio.h>
int main() {
int i, arr[5] = {1, 2, 3, 4, 5}, *p;
p = &arr[4];
for (i = 0; i < 5; i++)
printf("%dt%dt", *(p - i), p[-i]);
// why does this prints in reverse order?
return 0;
}
很简单,*(p - i)
和p[-i]
完全相同,语法不同。有趣的是,您也可以*(p - i)
-i[p]
完全相同的含义写作.
它以相反的顺序打印,因为你从arr[4]
开始,然后从指针中减去i
,指针逐个减去0
、1
、2
,直到它到达4
,所以它打印p[4]
、p[3]
、p[2]
、p[1]
、p[0]
这是从最后一个元素到第一个元素的数组arr
。
您在指针中分配了最后一个元素地址并逐个减去地址,因此它以相反的顺序打印