2016-05-16 75 views
-1

我不明白为什么最后一小段代码打印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

+3

启用你的编译器的所有警告,然后编译代码解决您的问题。不要忽视警告。 – dreamlax

+1

编译器和调试器是你的朋友。打开所有的警告......( - : – user3078414

+0

)启用你的编译器警告和迂腐的标准一致性。不要向人们询问机器可以免费给你的建议。 –

回答

2

这个程序应该产生多个编译器警告。解决这些问题将会很快解决问题,并消除任何误解。

b的类型是指针指向数组,指向int。这就是为什么下面两个赋值都是无效的:

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

分配指针int的指针到指针-TO-int,这是不正确。

问题是由打印指针掩蔽为好像它是一个int

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

b[0][0]的类型是一个指针TO- int,但你把它传递给%d,这将其解释为一个int。但是,b[0][0]的实际值是int,所以您会看到预期值。

解决了这个问题很简单:变化

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

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

Demo.

+0

谢谢!我之所以写代码就是因为我想要指针b用指针指向指针。 我以为b会指向一个有3个指针的数组,但我想我反而用3个指针指向了一个数组。我猜应该有一个简单的解决方案。 – Martin

+0

是的,这是它! :) http://stackoverflow.com/questions/6130712/pointer-to-array-of-pointers – Martin

0

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

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

是错误的。

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

*(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];