要談多維陣列,首先先了解下一維陣列的指標應用。
int arr[10];
通過上述**,我們定義了乙個長度為10的整形陣列。
int為陣列的基型別,他確定了每個陣列元素所占用的空間。在visual studio編譯器中int佔4個位元組。所以arr陣列總共佔據了40個位元組的空間。在陣列定義時,陣列所需要的空間就已經分配出來了。
arr是陣列名。除了用來代表這個陣列,他還對應著該陣列第乙個元素的位址,即arr[0]的位址。也就是說arr == &arr[0]
的結果是true
。arr還有一些細節方面的東西值得我們注意一下。雖然arr可以用作算術運算,但是arr是乙個常數,也就是說你無法改變arr的值,即arr++
或arr--
之類的操作都是無效的(簡單的說,arr也是乙個指標變數,它的特殊之處在於它儲存的位址是無法改變的)。若要完成++
類似的操作,就需要用乙個指標變數,arr的值賦值給指標變數,即指標變數指向陣列的第乙個元素。
既然指標是乙個變數,那麼他的值就可以通過算術運算進行改變。
int *pos;
pos = arr;
通過上述**,我們定義了乙個指向整型資料的指標變數。並且該指標變數內儲存的位址恰好是陣列的首位址。通過pos + 1
我們可以獲得陣列第二個元素的位址,也就是下標為1的陣列元素的位址。pos + 1
不是位址加一,而是要看指標變數的基型別,這裡的是int型別,所以pos+1它指的是位址加4。即如果pos儲存的位址為2000,pos + 1是2004而不是2001。既然pos+1是指向第二個元素的位址,那麼如何獲取該位址的內容呢?很簡單,只需要使用乙個符號即可----*
。*(pos + 1)
就可以獲取到第二個原素了,和arr[1]是等價的。
int arr[3][4];
二位陣列是一維陣列的拓展,可以看成是一維陣列中的每個元素都是乙個陣列。如果我們這麼想那麼理解二維陣列的指標應用就很簡單了。
通過一維陣列的知識我們知道arr他表示的是乙個位址。一維陣列中他表示的是首個元素的位址,這裡也是表示首個元素的位址。剛才我們說了,二維陣列就是一維陣列中每個元素又儲存了乙個長度相同的一維陣列。那我們姑且先把二維陣列看成是乙個一維陣列。那麼arr就是指向首元素的位址,而二維陣列的首元素是乙個陣列。
如果給arr加1操作呢?那麼他的位址會加上4 * 4;從而指向第二行首元素的位址。
剛才我們說了每一行都是乙個陣列。所以arr[0]
表示第一行的陣列的陣列名,根據一維陣列的定義,陣列名就是陣列首元素的位址。因此arr[0]是乙個位址而非數值。對arr[0]+1指向的是該行的第二個元素也就是arr[0][1]這個元素的位址。
再結合取值操作符—*
我們還可以有更多樣的操作。剛才我們知道arr是表示第一行的位址*(arr)我們就可以取出第一行的位址,因為第一列是乙個陣列,他又是指向首元素的位址,所以*(*(arr))就可以獲取到整個陣列中第乙個元素的值。*(*(arr+1)+1)
就可以獲取到arr[1][1]的值了。
C語言多維陣列指標的技巧
最近在學習c下多維陣列指標的時候,發現個小的技巧。比如定義乙個二維陣列,int a 3 4 如果想引用第乙個元素,直接 a,就可以了。當然如果定義三維的陣列,引用第乙個元素,直接 a。多維的照此推理就可以了。如果在程式中使用指向陣列元素的指標變數,對其賦初值時,要使用元素位址,不能使用行的位址。如果...
C語言指向多維陣列的指標
設有整型二維陣列a 3 4 如下 0 1 2 3 4 5 6 7 8 9 10 11 它的定義為 int a 3 4 設陣列a的首位址為1000,各下標變數的首位址及其值如圖所示。前面介紹過,c語言允許把乙個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a 0 a 1 a 2 ...
c語言高階 多維陣列本質及指標陣列的應用分析
一維陣列int a 10 在做函式引數時會退化為指標int a,但是二維指標做函式引數時卻不能寫成二級指標,那麼二維陣列的本質到底是什麼,可以通過 來驗證。int a 3 5 i 0,j 0 定義乙個3 5的二維陣列 int tmp 1 for i 0 i 3 i printf a d a 1 d ...