取消引用双指针

时间:2016-05-16 13:05:36

标签: c pointers dereference

我不明白为什么最后一段代码打印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是指向数组或指针的指针,但我想发生的事情是我用**指针指向数组。

下面的答案是代码以一种方式工作的很好的解决方案,这里是一个解决方案,用于使代码按照我原定的目的运行:

Pointer to Array of Pointers

2 个答案:

答案 0 :(得分:2)

该程序应产生多个编译器警告。修复它们可以解决问题,并消除任何误解。

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

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

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

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

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

b[0][0]的类型是指向int的指针,但您将其传递给%dint将其解释为b[0][0]。但是,int的实际值为int **b[3]; ... *(b+2) = &val3; ,因此您可以看到预期值。

解决问题很简单:更改

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

            Response.ContentType = "application/zip";
            Response.AddHeader("content-disposition", "attachment;filename=" + response.FileName);
            Response.BinaryWrite(response.Bytes);
            Response.End();

Demo.

答案 1 :(得分:0)

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

*(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("%d\n",b[0][0]); 
printf("%d\n",**(b+0) ); 

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

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

您可以使用

解决问题
int *b[3];