取消引用双指针

Dereferencing double pointer

我不明白为什么最后一段代码打印的是 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 的指针分配给指向指向指向 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.

从严格的打字角度来看,行:

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

错了。

*(b+0)的类型与b[0]的类型相同,即int**
&val1 的类型是 int*

*(b+1) 存在相同类型的不匹配。

&val3 的类型是 int (*)[2]

*(b+2)+1 指向不同于 val3[1] 地址的内存,因为指针算法是在指向 int* 的指针上完成的,而不是指向 [= 的指针24=].

行中

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

您正在将 int* 传递给函数,而格式说明符需要 int。其余 printf 个语句存在同样的问题。

如果您使用 gcc,请使用编译器标志 -Wall 来检测此类问题。

您可以使用

解决您的问题
int *b[3];