关于c代码输出的解释

时间:2014-11-21 15:16:19

标签: c

我在网络上的某个地方找到了这个代码,我能够弄清楚所有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

1 个答案:

答案 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]a1a1[2]为8

printf("%d,", *b[2]);

b[2]a3*a3a3的第一个元素,即-12

printf("%d,", *++b[0]);

b[0]a1然后我们增加,因此我们*++a1相当于a1[1]即7

printf("%d,", *(++b)[0]);

现在,在这种情况下,我们必须首先执行(++b),这相当于++x a2。现在我们有*a2[0],这是23。重要的是我们刚刚更改了bb的指针刚刚增加并将新指针存储在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

另外请注意,编写此类代码的方式比问题中的示例代码更清晰,因此请不要在生产代码中执行此类操作。这个答案中的第二个代码片段在我的脑海中比第一个更清晰。