2016-05-16 146 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];