我們知道一維陣列名是常量指標,我們可以將一維陣列名賦給乙個指標型別再對一維陣列進行相關的操作,那二維陣列名又是什麼?
我們這樣初始化乙個二維陣列int a[3][3]=或者為int a[3][3]=,,};從後面乙個定義我們可以看出二維陣列是由兩個一維陣列組成的也就是說二維陣列是「陣列的陣列」。
問題
了解了二維陣列那麼二維陣列名又是什麼呢,是不是和一維陣列名一樣是個一維指標呢?看下面**:
從**的結果可以看出只有**a才能輸出陣列中的元素,*a輸出的是乙個位址,那麼我們是不是可以吧二維陣列名理解為指標的指標。然後定義乙個指標的指標 int **p,將陣列名賦給p然後二維陣列進行相關操作呢?答案是否定的,看下面**:
**1
#include
void main()
,,};
int **p;
p=a;
printf("%d",**p);
}
但是這個**編譯不過,顯示error為「無法從int[3][3]轉化為int **,那就說明了二維陣列名不是指標的指標。那二維陣列名又是什麼呢?看**:
從這個結果我們可以看出我們可以先定義乙個陣列指標int (*p)[3],然後將a陣列名然後進行相關操作,即二維陣列名是乙個陣列指標,然後對p+1指向的是下乙個陣列即下一行的位址進行操作。
原因
二維陣列名即陣列位址,指向首行位址,不是指標的指標。表面上看,行位址即一維陣列指標,而陣列名指向行搜尋就應該是指標的指標。 但是你考慮過沒有,如果a[3][3],假設int**p=a; 那麼要對行遞增執行p++時,編譯器如何知道列寬?因為int**是指指向乙個 int 型別的指標,其資料寬度是4位元組,內建寬度,因此p將指向下乙個整數元素位址,也就是p遞增了4位元組,而不是3個int型資料的寬度,這就錯位了。 所以a[3][3]的位址型別不是簡單的指標的指標,而是行指標的指標,而行寬是由你定義的陣列列數和元素型別所決定,int型別就是4*3=12個位元組。這叫資料對齊。因此編譯器在轉換陣列名時,會根據對齊要求而確定相應的指標型別,所以a的位址型別應該是int ()[3],而不是int **。 所以應該這樣int (*p)[3]=a; 其含義為,p是乙個指向(含3個int型別元素的一維陣列或行的)指標,其實本質上任何指標都是4位元組(32位系統),你完全可以將一種指標型別強制轉為任何其他型別,那為什麼還要區分指標型別,就是為了指標運算時實現資料對齊,準確定位。
C 指標陣列,陣列指標,陣列名,二維陣列
本文較為詳細的分析了關於理解c 指標陣列,陣列指標,陣列名,二維陣列的一些技巧。是比較重要的概念,相信對於大家的c 程式設計有一定的幫助作用。一 關於陣列名 假設有陣列 1 inta 3 1.陣列名代表陣列第乙個元素的位址,注意,不是陣列位址 雖然值相等 是陣列第乙個元素位址,a 等同於 a 0 a...
二維陣列名 二維陣列名取位址 二級指標
先給出結論,便於以後查閱 首先給出幾個定義 typedef int p1x4 4 定義資料型別,p1x4這種型別為指向含4個int元素的1維陣列的指標 typedef int p3x4 3 4 定義資料型別,p3x4這種型別為指向含3x4個int元素的2維陣列的指標 下面從一維陣列說起 定義 int...
二維陣列名不能作為指標傳遞
二維陣列名即陣列位址,指向首行位址,表面上看,行位址即一維陣列指標,而陣列名指向行就應該是指標的指標,但是必須注意指標也是有型別的,型別不同資料寬度也不同。如果a 10 10 假設int p a 那麼要對行遞增執行p 時,編譯器如何知道列寬?因為int 是指指向乙個 int 型別的指標,32位系統中...