這個r和c怎麼看?r算出來的是二維數組的全部元素?可是看下面的程序,算出的應該是有多少行的啊?c的話怎麼算,什麼意思,

完全不懂。有人能解答解答嗎?幫幫忙,感謝感謝。

來自一個想學好c語言的工科女。


首先你要知道 C 語言裏數組 (Array) 就是一連串集合,就是一個指針 (Pointer)。一般不會將二維數組宣告成這樣:

int a[][3] = { 9, 1, 4, 7, 3, 6 };

在內存 (Memory) 裏就是申請一連串地址如下:

0x7ffee1028d10 -&> 9
0x7ffee1028d14 -&> 1
0x7ffee1028d18 -&> 4
0x7ffee1028d1c -&> 7
0x7ffee1028d20 -&> 3
0x7ffee1028d24 -&> 6

從 0x7ffee1028d10 開始一個堆棧 (Stack)。而 int 是佔用 4 Byte,所以每一個元素地址差 4 Byte (第一個 0x7ffee1028d10, 第二個 +4 Byte -&> 0x7ffee1028d14)。


這源碼裏宣告 a[][3] 在編譯處理的時候,會從二維數組長度開始將變數放入。所以就會變成:

int a[2][3] = {
{ 9, 1, 4 },
{ 7, 3, 6 }
};

為什麼變成這樣,涉及到編譯原理和 Data structure。可以先簡單理解。因為 a[][3] 會從 a[0][0] (0x7ffee1028d10) 開始裝填數據:

a[0][0] (0x77ffee1028d10) &


sizeof() 再其他回答也有名確解釋,可以參考文檔。可以想像就是將內存地址長度相減

sizeof(a) -&> 0x77ffee1028d28 - 0x77ffee1028d10 = 0x18 (24 byte)
sizeof(a[0]) -&> 0x77ffee1028d1c - 0x77ffee1028d10 = 0xc (12 byte)
sizeof(int) -&> 0x4 (4 byte)

sizeof(int) 會和 sizeof(a[0][0]) 等價,都是 4 Byte。

所以

int r = sizeof(a) / sizeof(a[0]); /* 24 / 12 = 2 (length) */
int c = sizeof(a[0]) / sizeof(int); /* 12 / 4 = 3 (length) */

這就是 r, c 與數組的關係


Number of elements in any array a including VLA (since C99) may be determined with the expression sizeof a / sizeof a[0]. Note that if a has pointer type (such as after array-to-pointer conversion of function parameter type adjustment), this expression would simply divide the number of bytes in a pointer type by the number of bytes in the pointed type.

詳見: sizeof 文檔

儘管我不確定你是否刻意,是否在意指此事,你涉及到了一個初學者容易忽略的問題。

數組元素個數的計算方法,在數組聲明的語句塊內,可以使用如你所提供的圖中那樣用sizeof數組除以sizeof元素的方法來計算,這種計算方法一般是不提倡的 。

因為數組在被作為參數傳遞的時候會「退化」,表現為在別的塊語句中無法這樣去計算傳入的數組大小。

要認識到靜態數組是一種在編譯時就確定了大小的數據類型,所以沒有必要去計算,直接用預處理指令define給出就可以了。

像你圖中二維數組很明顯列只有三列,行我沒有計算,但明顯寫個10是夠用的。

至於如何適當的列印,應該增加一個數組內元素個數的計數器,在列印時使用它來作為列印的終止條件。

總而言之如果你想學好C語言的話,你其實走了一條岔路。你閱讀的書不是一本好書,不過這並不意味著你就沒機會學好C語言了。重要的還是勤耕不墜和認真深刻的思考,不要放過細節,祝君好。


a是一個二維數組,裡面的每個元素長度是3

這裡的r代表了a裡面有多少個長度3的子數組

c代表了每個子數組的長度,也就是3


這個寫法就是動態計算二維數組a的維度,r代表第一維,值應該為2,c代表第二維,應該是3

具體計算細節,可以在debug中看以下變數的值的

sizeof(a)應該是sizeof(int)*6,sizeof(a[0])應該是szieof(int)*3,那麼很容易計算r=2,c=3

這個計算的目的是為了以後在改數組a的維度以後,不用再更改下面的代碼,

當然使用宏定義或者const變數改變維數也不是不可以,但是修改了a的數組內容之後,還要再多一步操作,就是修改宏定義或者const變數,而這樣寫,唯一需要改變的就只有a的定義這一行代碼


sizeof用於計算變數或者類型佔用的位元組長度,圖中sizeof(a)應該是24(int類型4位元組,6個數字就是24個位元組),但是如果去試一下sizeof(p),發現就不是24了,這是計算p這個指針的位元組佔用,32位系統裏裏4位元組,64位系統裏就是8位元組。

題目中 r = sizeof(a)/sizeof(a[0]) ,sizeof(a[0])計算第二維數組中一個數組的長度,相除就是計算二維數組的中數組的個數。

而e=sizeof(a[0])/sizeof(int) (或者 sizeof(a[0]/sizeof(*a[0]))則是計算一維數組的整數個數。

簡單說就是總長度/每個元素佔的長度即為元素的個數。


玩硬體 系統


我說一下我的理解哈,可能有些地方說得不是很正確,發現說得不對的地方請指出。

以下是正文:

要理解二維數組首先要了解指針數組和二級指針,就像這樣

char* a[2];
char** p = a;

指針數組是保存指針的數組(這句是廢話),數組的值都是地址,數組名是指針數組的地址,是指針的指針,也就是二級指針。

那麼,二維數組表達上可以寫成這樣

char a[2] = {0};
char b[2] = {0};
char c[2] = {0};
char* d[2] = {a,b,c};

char e[2][3] = {0};
char (*q)[2];
q = e;

//賦值操作可以這樣
d[0][0] = 1;//等價於a[0] = 1
d[0][1] = 2;//等價於a[1] = 2

//或者這樣
*(*(q + 0) + 0) = 1;//等價於e[0][0] = 1
*(*(q + 0) + 1) = 2;//等價於e[0][1] = 2
*(*(q + 1) + 1) = 3;//等價於e[1][1] = 3
//指針的玩法很多很靈活,感興趣可以自己研究

所以根據上面的理解可以得到下面的知識點

1、二維數組本質上是若干個下標相同的一位數組的集合。

2、上面d數組的下標相當於二維數組行號,一維數組的下標相當於二維數組列號。

3、二維數組名是數組的首地址,所以sizeof二維數組名之後得到的是整個二維數組長度。

4、二位數組加行號,類似於這樣e[0],這是表示取第0個一位數組的首地址,sizeof一維數組的首地址,得到的是一維數組的長度。

**********************************************************************************************************************************************************************************************

圖片上的代碼理解:

1、數組的下標如果在聲明中不寫,則表示以賦值的時候的實際情況來定,這是編譯器乾的事,我們不管。所以在你給出的圖片中,a[][3]實際上等價於a[2][3],就是一個兩行三列的數組。

int (*p)[3];

2、上面的語句是二維數組指針的聲明,它就是一個指向一個有3個元素的int型的一位數組首地址的指針,本質上是一個二級指針,理解成是 int**p 的一種特殊形態就行了。

3、所以在給出的圖片代碼中,r = 二維數組行號,c = 二維數組列號

4、for循環就是一個簡單的二維數組遍歷。

5、另外,sizeof()是一個計算工具,在括弧裡面放數組名計算的是數組長度,放數組元素計算的是數組元素長度,所以,在a[3]一維數組中,a和a[0]地址相同,但是sizeof(a)和sizeof(a[0])結果是不一樣的。

至於二維數組指針的用法,可以去網上查一查,現在都2020了,大把這種單一知識點的學習分享,網上很多文章知識點都來源於課本,但是表達上可能會比書本更加生動直白更易懂,學習上不要在一個教材上弔死,學不會學不懂就換書換老師。

另外,如果學習c語言尚有餘力的話可以看一看《c語言深度剖析》這本書,如果是初學者的話不建議看,因為可能會被裡面的知識點帶偏了,建議學了數據結構之後再看這本書,收貨會不少。

裡面介紹指針與數組的篇章是這樣的

C語言指針不難,就是很繞,一大堆的指針、二級指針、數組指針、指針數組、函數指針、指針函數,看著頭都大,但是看懂原理後萬變不離其宗,形式怎麼變都一樣。

最後,祝你學業有成。


那這樣看來,a【0】是代表a00 a01

a02?那sizeof(int)的意思不是int的長度嗎?知道的回答一下,感謝感謝!


推薦閱讀:
相關文章