gpt4 book ai didi

c - 关于c代码输出的解释

转载 作者:行者123 更新时间:2023-11-30 20:26:02 25 4
gpt4 key购买 nike

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

最佳答案

为了清楚起见,我将更改名称,然后逐行进行:

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*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。

这是这样工作的,因为这里的数组实际上只是一个连续的内存块。请注意,如果您执行 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

附加说明,与问题中的示例代码相比,有更好更清晰的方法来编写此类代码,因此请不要在生产代码中执行类似的操作。在我看来,这个答案中的第二个代码片段比第一个代码片段更清晰。

关于c - 关于c代码输出的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27064529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com