C语言 取消引用双指针



我不明白为什么最后一段代码打印的是 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("%dn",b[0][0]); 
printf("%dn",**(b+0) ); 
//Prints 2000
printf("%dn", b[1][0] ); 
printf("%dn",**(b+1) );
//Prints 3000
printf("%dn", b[2][0] );  
printf("%dn", **(b+2)  );  
//Should print 4000 i think, but prints 2000, why? 
printf("%dn", b[2][1] );  
printf("%dn", *(*(b+2)+1)  );

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

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

指向指针数组的指针

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

b的类型是指针到指针到int数组。这就是为什么下面的两个作业无效的原因:

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

将指针分配给int到指针到指针到int,这是不正确的。

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

printf("%dn", 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;

演示。

从严格的键入角度来看,这些行:

*(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*的指针上完成的,而不是指向int的指针。

在行中

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

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

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

您可以使用

int *b[3]; 

最新更新