gpt4 book ai didi

c - 取消引用双指针

转载 作者:太空宇宙 更新时间:2023-11-04 08:13:39 26 4
gpt4 key购买 nike

我不明白为什么最后一段代码打印的是 2000 而不是 4000。我猜是一些初学者错误。你知道吗?使用 DevC++。

int val1 = 1000;
int val2 = 2000;
int val3[2] = {3000, 4000};


int **b[3];


*(b+0)= &val1;
*(b+1) = &val2;
*(b+2) = &val3;

//Prints 1000
//Prints what the first element of b is pointing at
printf("%d\n",b[0][0]);
printf("%d\n",**(b+0) );

//Prints 2000
printf("%d\n", b[1][0] );
printf("%d\n",**(b+1) );

//Prints 3000
printf("%d\n", b[2][0] );
printf("%d\n", **(b+2) );

//Should print 4000 i think, but prints 2000, why?
printf("%d\n", b[2][1] );
printf("%d\n", *(*(b+2)+1) );

编辑:我想要的是 **b 是一个指向数组或指针的指针,但我想发生的事情是我将 **b 变成了一个指向指针的指针数组。

下面的答案是代码以一种方式工作的很好的解决方案,这里是如何使代码按我最初的预期工作的解决方案:

Pointer to Array of Pointers

最佳答案

这个程序应该产生多个编译器警告。修复它们对解决问题和消除任何误解大有帮助。

b 的类型是一个指针到指针到int 的数组。这就是下面两个赋值无效的原因:

*(b+0)= &val1; 
*(b+1) = &val2;

您将指向 int 的指针分配给 pointer-to-pointer-to-int,这是不正确的。

这个问题通过打印一个指针来掩盖,就好像它是一个int:

printf("%d\n", b[0][0]); 

b[0][0] 的类型是指向 int 的指针,但您将其传递给 %d ,它将其解释为 int。但是,b[0][0] 的实际值是一个 int,因此您看到的是预期值。

解决问题很简单:改变

int **b[3];
...
*(b+2) = &val3;

int *b[3];
...
*(b+2) = val3;

Demo.

关于c - 取消引用双指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37254645/

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