我在网络上的某个地方找到了这个代码,我能够弄清楚所有4个案例,但最后一个案件却让我一次又一次地处理一个令人困惑的情况。
#include <stdio.h>
int a1[] = {6, 7, 8, 18, 34, 67};
int a2[] = {23, 56, 28, 29};
int a3[] = {-12, 27, -31};
int *x[] = {a1, a2, a3};
void print(int *a[])
{
printf("%d,", a[0][2]);
printf("%d,", *a[2]);
printf("%d,", *++a[0]);
printf("%d,", *(++a)[0]);
printf("%d\n", a[-1][+1]);
}
main( )
{
print(x);
}
我认为可视化此类案例的最佳方法是:
a[0][2])=a-->a[0]-->a[0][2](way of understanding)=>a1[2]=8
执行时将输出显示为:
8,-12,7,23,8
答案 0 :(得分:1)
为了清晰起见,我将更改名称,然后逐行:
void print(int *b[])
{
printf("%d,", b[0][2]);
printf("%d,", *b[2]);
printf("%d,", *++b[0]);
printf("%d,", *(++b)[0]);
printf("%d\n", b[-1][+1]);
}
printf("%d,", b[0][2]);
b[0]
为a1
,a1[2]
为8
printf("%d,", *b[2]);
b[2]
为a3
,*a3
是a3
的第一个元素,即-12
printf("%d,", *++b[0]);
b[0]
为a1
然后我们增加,因此我们*++a1
相当于a1[1]
即7
printf("%d,", *(++b)[0]);
现在,在这种情况下,我们必须首先执行(++b)
,这相当于++x
a2
。现在我们有*a2[0]
,这是23。重要的是我们刚刚更改了b
,b
的指针刚刚增加并将新指针存储在b
中。
printf("%d\n", b[-1][+1]);
我们必须记住,b
之前更改了一行b
此处开始,就像最初传递b+1
一样。这意味着我们比以前更进一步开始指针一个地址:所以这就像我们(x+1)[-1][+1]
x[-1+1][+1+1]
或x[0][2]
a1[2]
那样是8。 / p>
这就像这样,因为这里的数组实际上只是一个连续的内存块。请注意,如果您执行int **x
,则会有所不同。
请注意,这是正确的结果,因为您可以在此处运行代码时看到:http://ideone.com/0mFvXn
基本上在最后一行可以证明发生的事情:
#include <stdio.h>
int a1[] = {6, 7, 8, 18, 34, 67};
int a2[] = {23, 56, 28, 29};
int a3[] = {-12, 27, -31};
int *x[] = {a1, a2, a3};
int main(void)
{
printf("%d, %d \n", x[0][0], x[1][1]);
int** z = x;
++z;
printf("%d, %d \n", z[0][0], z[1][1]);
return 0;
}
输出:
6, 56
23, 27
ideone上的最后一个代码段:http://ideone.com/cB5y75
另外请注意,编写此类代码的方式比问题中的示例代码更清晰,因此请不要在生产代码中执行此类操作。这个答案中的第二个代码片段在我的脑海中比第一个更清晰。