我被问到这个问题是一个课堂练习:
int A[] = {1,3,5,7,9,0,2,4,6};
printf("%d\n", *(A+A[1]-*A));
Run Code Online (Sandbox Code Playgroud)
我无法在纸上弄明白,所以继续编译一个简单的程序并对其进行测试,发现printf("%d",*A)
总是给我1
输出.
但我仍然不明白为什么会这样,所以如果有人能够解释这一点会很棒.
A被视为指向整数数组的第一个元素的指针.A [1]是该数组的第一个元素的值,它是3(索引是基于0的)*A是A指向的值,如果是数组的第0个元素,那么1.所以
A[1] - *A == 3 - 1 == 2
Run Code Online (Sandbox Code Playgroud)
现在我们有
*(A + 2)
Run Code Online (Sandbox Code Playgroud)
这就是指针算术开始的地方.由于A是指向整数的指针,A + 2指向该数组中的第二个(从0开始)项,*(A + 2)获取其值.所以回答是5.
另请注意,为了将来参考,指向整数和整数数组的指针在C中有些不同,但出于本讨论的目的,它们是相同的.