2011-04-12 92 views
0

如果我已經建立像 INT標記的陣列[4] [2]; 則數組名稱必須給我的第一個元素的地址,在一個維數組的情況下,但它是不是這樣呢? &也
printf("%d",marks[0]); & printf("%d",marks); 產生相同的結果?????????關於二維陣列

+0

只是要清楚,你是說'的printf( 「%d」,引號[0])'和'的printf(」 %d「,標記)'給你不同的輸出? – Nishan 2011-04-12 07:38:36

+0

是的,這就是我所說的。 – nobalG 2011-04-12 07:59:51

+0

@Alfred它打印什麼? – anatolyg 2011-04-12 18:42:17

回答

2
printf("%d",marks); 

給人一種錯誤的格式說明符導致未定義行爲marks導致指向1D數組的指針(即指向第一行的第一個元素的指針)。

因此,將指針的內容%p應改爲使用。

printf("%p",marks); 

而且似乎您試圖在一個位置打印值。所以 -

printf("%d",marks[0][0]); // [m][n] is the way of accessing 2D array elements. 
0

在C語言中,例如二維陣列被視爲一維數組,其元素是一維arrays.So如果你想要得到的任何元素的地址,你將不得不使用

的printf(「% 8u \ n「,& a [i] [j]);

兩個打印語句打印相同的結果,因爲這兩個標記和標記[0]是指向二維陣列的第一行的起始。

+0

這就是我所要求的,這兩個不是給我同樣的結果 – nobalG 2011-04-12 06:42:36

1

它的行爲如預期對我來說:

#include <stdio.h> 

int main(int argC,char* argV[]) 
{ 

    int marks[4][2]={0}; 
    printf("%x %x %x\n" 
     "%x %x %x\n" 
     "%x %x\n", 
     marks,marks[0],marks[0][0], 
     *marks,&marks,**marks, 
     &marks[0],&marks[0][0]); 
    return 0; 
} 

具有輸出:

12ff44 12ff44 0 
12ff44 12ff44 0 
12ff44 12ff44 

所有指針到列表中的第一個元素(除了的第一個元素的零列表)。

0

當您在printf格式使用%d,相應的參數(後默認促銷)必須有類型int。既然你在這兩種情況下違反了這條規則,任何事情都可能發生

marks具有類型int[4][2]並衰減到int(*)[2],這不是int

marks[0]具有類型int[2]和衰減到int*,這是不int

(但我仍然感到驚訝的實際執行將輸出不同的地址。)