2014-01-20 94 views
0

我想了解指針運算WRT二維數組中C.二維陣列指針問題

void pmanipulation(int arr[][5],int rows) 
{ 
printf("arr=%d arr+1=%d *(arr)=%d *(arr+1)=%d\n",arr,arr+1,*(arr),*(arr+1)); 
} 

在小的代碼段以上,我觀察到有明顯在通過ARR打印的值沒有不同+我和*(ARR + I)。爲什麼這樣?我知道在C arr +中,我將給出2D矩陣的第i行的基地址,但不應該在該地址處打印元素*(arr + i)?

感謝

+1

'*(arr + i)'是一個長度爲5的數組。你可以用'printf()'打印數組嗎?是的,但只有'char'數組(= C字符串)。你有一個'int'數組。並且'*(arr + i)'給出了第i行第一個元素的*地址*,而'arr + i'給出了整個第一行的地址,這與'*(arr + i)'帶有微妙的差異,'*((arr + i)[n])'僅在''n' 5'步驟中通過元素和'(*(arr + i))[n]步驟。 – mb84

+0

@ mb84-非常感謝您的解釋。 –

回答

0

讓我們看看這個簡單的程序:

#include <stdio.h> 

void main(){ 
    int i,j; 
    int a[3][5]; 
    for(i=0;i<3;i++){ 
     for(j=0;j<5;j++){ 
      a[i][j]=i*10+j; 
     } 
    } 
    printf("a=%d a+1=%d *(a)=%d *(a+1)=%d\n", a, a+1, *(a), *(a+1)); 
} 

當你編譯這個用gcc你:

test.c: In function 'main': 
test.c:11:2: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int (*)[5]' [-Wformat] 
test.c:11:2: warning: format '%d' expects argument of type 'int', but argument 3 has type 'int (*)[5]' [-Wformat] 
test.c:11:2: warning: format '%d' expects argument of type 'int', but argument 4 has type 'int (*)' [-Wformat] 
test.c:11:2: warning: format '%d' expects argument of type 'int', but argument 5 has type 'int (*)' [-Wformat] 

你會發現,*(a+1)仍然是一個指針。由於這是一個二維數組,因此您需要執行雙重解除引用以獲取值**(a+1)