2015-10-03 93 views
1

我想了解多維數組和指針,寫了這個小程序來理解這個概念:爲什麼我們需要使用雙指針來訪問2-D數組?

#include<stdio.h> 
void show(int arr[][2]); 
int main() 
{ 
    int z[2][2] = { { 1, 2 }, 
        {3, 4 } }; 
    show(z); 
} 

void show(int arr[][2]) 
{ 

    printf("value of arr = %d", arr); 
    printf("\n\nvalue of &arr[0]0] = %d", &arr[0][0]); 
} 

這段代碼打印這是有道理的相同的地址,但是當我編輯的顯示功能:

void show(int arr[][2]) 
{ 

    printf("value of *arr = %d", *arr); 
    printf("\n\nvalue of arr[0]0] = %d", arr[0][0]); 
} 

* arr仍然打印相同的地址,而arr [0] [0]如預期打印整數值,我想知道爲什麼我需要使用** arr獲取int值,如果arr存儲地址應該用* arr解除引用,不是嗎?

請幫助我真的很難理解這個概念..在此先感謝。

+0

這將有助於停止地址方面的思考。指針可以用內存地址來實現,但它們不是地址,將它們當作地址將會以多種方式混淆你,而不僅僅是這個。 – user2357112

+0

@ user2357112你能否請我介紹一些很好的文字,我可以理解這個概念。 – mightyWOZ

+0

'* array_or_pointer'與C中的array_or_pointer [0]相同(類型和值)。 – hyde

回答

5

如果你看一下2D陣列的內存佈局,事情可能會變得更清晰一些。

您已變量定義爲:

int z[2][2] = {{1, 2}, {3, 4}}; 

內存:

z 
| 
v 
+-----+-----+-----+-----+ 
| 1 | 2 | 3 | 4 | 
+-----+-----+-----+-----+ 

存儲器的另一種觀點:

z[0]  z[1] 
|   | 
v   v 
+-----+-----+-----+-----+ 
| 1 | 2 | 3 | 4 | 
+-----+-----+-----+-----+ 

存儲器的另一種觀點:

z[0][0]  z[1][0] 
| z[0][1] | z[1][1] 
|  |  |  | 
v  v  v  v 
+-----+-----+-----+-----+ 
| 1 | 2 | 3 | 4 | 
+-----+-----+-----+-----+ 

您現在可以看到的是,就純存儲位置而言,

&z == &z[0] == &z[0][0] 

我們也是知道,當一個數組衰變爲指針,它的值是數組的第一個元素的地址。因此,在衰減z的指針表達式,

z == &z[0] == &z (from above) 

這是令人費解,但z&z使用時計算出相同的地址,即使它們是不同的類型。

z衰減爲指針時的類型爲int (*)[2]&z的類型是int (*)[2][2]

來到你的功能,你必須:

void show(int arr[][2]) { ... } 

這相當於:

void show(int (*arr)[2]) { ... } 

爲什麼arr*arr計算出相同的價值呢?

arrmain評估爲&z[0]*arrmain評估爲z[0],其從main評估爲&z[0][0]

我們已經看到&z[0]&z[0][0]的值是一樣的。因此arr*arrshow()評估到相同的地址。

+0

@R Sahu感謝您的回覆。它幫助 – mightyWOZ

+0

@Balraj,歡迎您。很高興我能夠提供幫助。 –

+0

@RSahu哇令人驚歎難以置信的簡單,正確和充滿知識 – shami

相關問題