gpt4 book ai didi

c - C中包含复杂指针的代码输出

转载 作者:行者123 更新时间:2023-12-01 13:47:47 25 4
gpt4 key购买 nike

我在接受采访时他们问我:

What will happen if you compile the following code? Will it compile successfully? If yes, what will be the output?

static int a[ ] = {0,1,2,3,4};
int *p[ ] = {a,a+1,a+2,a+3,a+4};
int **ptr = p;
ptr++;
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);
*ptr++;
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);
*++ptr;
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);
++*ptr;
printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);

我没有答案。这比我解决的问题要复杂得多。

然后他们回复:

The output will be:

111
222
333
344

回家后我也无法真正理解它是如何工作的。有人可以向我解释一下吗?任何帮助表示赞赏。

最佳答案

让我们用一些任意地址数字表示数组 a 的地址以便更好地理解(不考虑 int 的大小)。

a[] = {0,1,2,3,4}

地址值
1000 = 0
1001 = 1
1002 = 2
1003 = 3
1004 = 4

现在 int *p[ ] = {a,a+1,a+2,a+3,a+4}; 是一个指针数组。所以它基本上保留了一些地址。让我们也为这个数组假设一些任意地址

地址值
2000 = 1000(a 表示 a[0] 的地址,a+1 表示 a[1] 的地址,依此类推)
2001 = 1001
2002 = 1002
2003 = 1003
2004 = 1004

int **ptr = p; 是指向另一个指针的指针。所以它基本上指向数组 p 的第一个地址,它是 2000 并且值为 1000

ptr++; 将指针 ptr 前进一步。所以它现在指向 p 的第二个地址,即 2001,值为 1001

现在 printf(“\n %d %d %d”, ptr-p, *ptr-a, **ptr);:

ptr

值为2001p 的值为2000(因为p code> 表示 p[0] 的地址)。所以区别是2001-2000 = 1

*ptr 的值为1001a 的值为1000。所以区别是1001-1000 = 1

**ptr 的值是 1。因为 ptr=2001*ptr = 1001**ptr = 1(地址 1001 处的值)

关于c - C中包含复杂指针的代码输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34562446/

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