C語言指標 二維陣列,為啥會這樣?

時間 2021-09-09 17:25:25

1樓:

沒明白你不理解的點在哪,我猜是單純糾結於為什麼要寫成0*COLS+0而不直接寫0。

答案是直接寫0也可以,其實是為了統一下格式,*就是乘號,結果上和直接寫0沒區別。

((int*)a+0*COLS+0)

((int*)a+1*COLS+2)

((int*)a+3*COLS+2)

統一成這種格式而已。沒啥講究的,還是(指標+破數字)這種格式當然你也可以理解為是增加的行數,因為偏移cols的長度就相當於增加一行。

總之他就是乘法的乘號,只不過這個表示式裡可以這麼理解而已。

如果不是我猜的那樣,那我盡可能簡潔的講一下。

1.資料的存放

2.指標及其偏移

3.回到問題

2樓:

我幫上一位答主再補充一點說明。

首先你要理解二維陣列是怎麼存放的,二維陣列本質上是乙個指標,指向一塊連續的記憶體空間,並按照規定的粒度讀出資料。5行8列的二維陣列宣告是int a[5][8],這裡a的型別是int (*)[8],也就是乙個陣列指標,每乙個a[i]表示這個陣列第i行的首元素位址。

那麼,為什麼我們用a[i]就能得到這個位址呢?因為指標的「粒度」不同,a這個指標在+1的時候,向前移動8個int型資料長度的位置(因為型別是int (*)[8]),而你的書上把a強制轉換成了int*型的指標,它+1的時候只會向前移動乙個int型資料長度的位置,你可以和前面int ()[8]比較,不難發現如果要想讓(int *)a 表現得和a一樣,那麼每次向下移動一行的時候,都要移動8個int型資料長度的位置,所以第1行的第i個元素可以用*((int )a+1*8+i)來訪問。

不要死記硬背,理解了指標的「粒度」,到底該加多少就是非常明顯的事情。參考:

如何理解一維指標陣列指向二維指標

szouc 兩個重要的基本概念偶爾會在教材中被忽視。1.陣列名出現在表示式中會隱式轉換成指向該陣列第乙個元素的常量指標。特殊情況暫忽略。2.解引用 運算子與下標 運算子等價,a 3 a 3 c 2 4 c 2 4 c 2 4 題目中 int c 4 是指標陣列,當陣列名 c 出現在表示式中,根據 1...

c語言指標二維陣列a中,a和a 0 的值不應該是一樣的嗎?為什麼會出現以下問題?

給你把各個型別的關係理清就懂了。首先說a,假設a是乙個5個元素的int陣列,那麼a的型別是int 5 是陣列型別,其元素為int,有5個元素長。然後關於a 1這個表示式,由於陣列型別本身是不可變的,也不可 1,但是c語言規定了一條規則,那就是陣列型別可以隱式轉換成其首元素的指標,結果型別是int i...

C 語言中指標陣列和陣列指標 函式指標 指向函式的指標等等該怎麼理解?

ga6840 direct declarator IDENTIFIER declarator direct declarator direct declarator assignment expr direct declarator declarator direct declarator poin...