C 二維陣列和指標的關係

2021-12-29 16:22:42 字數 2087 閱讀 6537

再翻開c++ primer時,不禁感嘆此書的嚴謹細緻。再學習下陣列和指標。主要講解二維陣列和指標的對應關係。

掃盲+複習:

陣列是一種復合資料型別,對資料型別,必然要介紹定義和初始化。

定義和初始化:陣列的維數必須用值大於等於1的常量表示式定義。此常量表示式只能包含整型字面值常量、列舉常量貨用常量表示式初始化的整型const物件。非const變數及要到執行階段才知道其值的const變數都不能用於定義陣列的維數。顯示初始化的陣列不需要指定其維數值。沒有引用型別的陣列。

對初始化說兩句:函式體外定義的內建陣列型別,元素初始化為0;體內定義無初始化。元素型別為類型別時,預設建構函式初始化,無缺省建構函式,則必須顯示初始化,與陣列定義位置無關。字元陣列用字串字面值初始化時,注意字串字面值包含乙個額外的空字元。再叨叨一句指標:理解指標宣告語句時,請從右往左閱讀。

//以下是本文介紹的重點:

陣列名----二維陣列的儲存----指標和二維陣列的關係-----指標和陣列的轉換關係深入講解

一、先說說陣列名,陣列名代表陣列第乙個元素的指標。對一維陣列,陣列名就代表首元素位址;對二維陣列,因其元素是陣列,所以陣列名代表首個行位址。

對二維陣列a,區分下a和a[0]:

a代表首個行位址,它的每個元素都是乙個行陣列,因此,它的指標移動單位是「行」。使用a[0]是把二維陣列看做乙個一維陣列來處理,即它的元素不再是行,而是單個陣列元素。所以它指向的是陣列的首個元素,它的指標移動單位是「單個陣列元素」。

二、二維陣列在記憶體中如何儲存:

int a[2][3]=;

int m=a[0][5];//m=6

所以c++的陣列在記憶體中是沒有維數的概念的。二維陣列儲存時,是按照先行後列的順序依次儲存的。把每行看做乙個整體,即視為乙個大的陣列元素。

三、指標和二維陣列的對應關係:

1) 指標對應的二維陣列元素位址:

int a[2][3]=;

int* p=a[0];

int m=*(p+3);//m=4     即若有p=a[0](a是二維陣列),則p+j指向a[0][j]。

2) 二維陣列元素位址對應的指標:

int a[2][3]=;

int* p=a[0];

a[i][j]=*(p+i*列數+j);或a[i][j]=p[i*列數+j];

3) 二維陣列名和二維陣列元素的對應關係:

用二維陣列名作位址表示陣列元素:二維陣列a表示行元素,a+i表示第i個行元素。所以a [i] [j]用陣列名表示為:*(*(a+i)+j)

4) 行陣列指標:

int a[2][3]=;

int** p=a;//編譯錯誤

可以通過定義陣列指標的方式,使得乙個指標變數與二維陣列名具有相同的性質。定義方法:int (*p)[4]=a;

區分陣列指標和指標陣列:陣列指標是指向陣列首元素的位址的指標,其本質為指標,定義為:int (*ptr_array) [10];。指標陣列是陣列元素為指標的陣列,其本質為陣列,定義為:int *ptr_array[10];。

四、深入講解:

void function(int**array,int width,int height)

然後我們定義了乙個二維陣列 intp[3][3]=,,};

當我們呼叫function時,即function(p,3,3),編譯器會報錯:

error c2664:'function' : cannot convert parameter 1 from int [3][3]' to int **'

陣列名和指標還是有區別的。c++支援陣列自動轉為指標型別,但指標無法自動轉換為陣列型別,轉換是基於從外層到內層的順序開始轉換,外層相同不再轉換。

這兒為了方便講解,先說個關係:把指標的陣列認為是陣列巢狀在指標外層,c++支援的轉換只能從外層至內層的順序轉換,若外層相同不轉換。所以,array(指標的指標)和p(陣列的首元素位址,即陣列首元素的指標)不能轉換為同一型別。對陣列指標和指標陣列:指標陣列可轉為指標的指標,指標的指標與陣列指標不同。用**表示即:

int a[2][3];

int (*p)[2]=a;// 這個沒轉換,p是陣列的指標,a也是

int *arr[3];

int **q=arr;//arr是指標陣列,轉為指標的指標

二維陣列和指標的關係

二維陣列和指標 要用指標處理二維陣列,首先要解決從儲存的角度對二維陣列的認識問題。我們知道,乙個二維陣列在計算機中儲存時,是按行儲存的,即先儲存第一行的元素,再儲存第二行的元素。當把每一行看作乙個整體,即作為乙個大的陣列元素時,原來的 二維陣列也就變成乙個一維陣列了。而每個大陣列元素對應原來 二維陣...

二維陣列和指標的指標的關係?

首先說 沒有關係!先告訴自己三遍 沒有關係,沒有關係,沒有關係 例 include intmain void int p1 arr 0 一級指標 int p2 arr 二級指標,即指標的指標 int p3 2 arr 指向乙個內含兩個int型別值陣列 printf p2 d n p2 printf ...

C 二維陣列與指標的關係

一維陣列 首先說陣列,陣列是乙個很神奇的東西。因為它的名字可以當做首元素的指標,但是當你sizeof 陣列名 的時候,又可以顯示出整個陣列的大小。據說這是因為sizeof在編譯時就已經計算出變數的大小了。當陣列當做函式引數傳遞時,它自動被轉換為陣列首元素的指標。但是我們不可以改變陣列的位址。比如說 ...