指標陣列,陣列指標

2021-06-09 02:40:20 字數 3358 閱讀 3087

(1)指標陣列:乙個陣列裡存放的都是同乙個型別的指標,通常我們把他叫做指標陣列。

比如 int * a[10];它裡邊放了10個int * 型變數,由於它是乙個陣列,已經在棧區分配了10個(int * )的空間,也就是32位機上是40個byte,每個空間都可以存放乙個int型變數的位址,這個時候你可以為這個陣列的每乙個元素初始化,在,或者單獨做個迴圈去初始化它。

例子:int * a[2]=;     //在棧區里宣告乙個int * 陣列,它的每乙個元素都在堆區里申請了乙個無名變數,並初始化他們為3和4,注意此種宣告方式具有缺陷,vc下會報錯

例如 :

int * a[2]=;

delete a[0];

delete a[10];

但是我不建議達內的學生這麼寫,可能會造成歧義,不是好的風格,並且在vc中會報錯,應該寫成如下 :

int * a[2];

a[0]= new int[3];

a[1]=new int[3];

delete a[0];

delet a[10];

這樣申請記憶體的風格感覺比較符合大家的習慣;由於是陣列,所以就不可以delete a;編譯會出警告.delete  a[1];

注意這裡 是乙個陣列,不能delete ;

( 2 ) 陣列指標 : 乙個指向一維或者多維陣列的指標;

int * b=new int[10]; 指向一維陣列的指標b ;

注意,這個時候釋放空間一定要delete ,否則會造成記憶體洩露, b 就成為了空懸指標.

int (*b2)[10]=new int[10][10]; 注意,這裡的b2指向了乙個二維int型陣列的首位址.

注意:在這裡,b2等效於二維陣列名,但沒有指出其邊界,即最高維的元素數量,但是它的最低維數的元素數量必須要指定!就像指向字元的指標,即等效乙個字串,不要把指向字元的指標說成指向字串的指標。這與陣列的巢狀定義相一致。

int(*b3) [30] [20];  //**指標――>指向三維陣列的指標;

int (*b2) [20];     //二級指標;

b3=new int [1] [20] [30];

b2=new int [30] [20];

兩個陣列都是由600個整數組成,前者是只有乙個元素的三維陣列,每個元素為30行20列的二維陣列,而另乙個是有30個元素的二維陣列,每個元素為20個元素的一維陣列。

刪除這兩個動態陣列可用下式:

delete b3;  //刪除(釋放)三維陣列;

delete b2;  //刪除(釋放)二維陣列;

再次重申:這裡的b2的型別是int (*) ,這樣表示乙個指向二維陣列的指標。

b3表示乙個指向(指向二維陣列的指標)的指標,也就是**指標.

( 3 ) 二級指標的指標

看下例 :

int (**p)[2]=new (int(*)[3])[2];

p[0]=new int[2][2];

p[1]=new int[2][2];

p[2]=new int[2][2];

delete p[0];

delete p[1];

delete p[2];

delete p;

注意此地方的指標型別為int (*),碰到這種問題就把外邊的[2]先去掉,然後回頭先把int ** p=new int(*)[n]申請出來,然後再把外邊的[2]附加上去;

p代表了乙個指向二級指標的指標,在它申請空間的時候要注意指標的型別,那就是int (*)代表二級指標,而int (**)顧名思義就是代表指向二級指標的指標了。既然是指標要在堆裡申請空間,那首先要定義它的範圍:(int(*)[n])[2],n 個這樣的二級指標,其中的每乙個二級指標的最低維是2個元素.(因為要確定乙個二級指標的話,它的最低維數是必須指定的,上邊已經提到)。然後我們又分別為p[0],p[1],p[2]…在堆裡分配了空間,尤其要注意的是:在釋放記憶體的時候一定要為p[0],p[1],p[2],單獨delete ,否則又會造成記憶體洩露,在deletep 的時候一定先delete p[0]; delete p[1],然後再把給p申請的空間釋放掉 delete p ……這樣會防止記憶體洩露。

(3)指標的指標;

int ** cc=new (int*)[10]; 宣告乙個10個元素的陣列,陣列每個元素都是乙個int *指標,每個元素還可以單獨申請空間,因為cc的型別是int*型的指標,所以你要在堆裡申請的話就要用int *來申請;

看下邊的例子  (vc & gnu編譯器都已經通過);

int ** a= new int * [2];     //申請兩個int * 型的空間

a[1]=new int[3];        //為a的第二個元素又申請了3個int 型空間,a[1]指向了此空間首位址處

a[0]=new int[4];        為a的第乙個元素又申請了4個int 型空間,a[0] 指向了此空間的首位址處

int * b;

a[0][0]=0;

a[0][1]=1;

b=a[0];

delete a[0]       //一定要先釋放a[0],a[1]的空間,否則會造成記憶體洩露.;

delete a[1];

delete a;

b++;

cout<<*b《注意 :因為a 是在堆裡申請的無名變數陣列,所以在delete 的時候要用delete 來釋放記憶體,但是a的每乙個元素又單獨申請了空間,所以在delete a之前要先delete 掉 a[0],a[1],否則又會造成記憶體洩露.

(4) 指標陣列 :

我們再來看看第二種 :二維指標陣列

int *(*c)[3]=new int *[3][2];

如果你對上邊的介紹的個種指標型別很熟悉的話,你一眼就能看出來c是個二級指標,只不過指向了乙個二維int * 型的陣列而已,也就是二維指標陣列。

例子 :

int *(*b)[10]=new int*[2][10];//

b[0][0]=new int[100];

b[0][1]=new int[100];

*b[0][0]=1;

cout <<*b[0][0]delete b[0][1];

delete b;

cout<<*b[0][0]《這裡只為大家還是要注意記憶體洩露的問題,在這裡就不再多說了。

第二種 :

int **d[2];表示乙個擁有兩個元素陣列,每乙個元素都是int ** 型,這個指向指標的指標:)

d不管怎樣變終究也是個陣列,呵呵,

如果你讀懂了上邊的,那下邊的宣告就很簡單了:

d[0]=new int *[10];

d[1]=new int * [10];

delete d[0];

delete d[1];

具體的就不再多說了 :)

陣列,指標,指標陣列,陣列指標

指標是在32位系統下佔四個位元組,64位系統下佔八個位元組的一種型別,指標指向的內容可以是常量,變數,函式,結構體,指標本身,陣列,等等.一級指標 一級指標常常在函式傳參時使用,可傳的引數有一維陣列,常量指標,函式指標等等都可以 但我們要注意不要在函式中,通過改變形參的指向來達到改變實參指向的效果,...

指標, 指標的指標, 陣列, 指標陣列, 陣列指標

指標 int a 10 int p a 指標的指標 int b 20 int p b int p2p p 簡單陣列 int c 10 整數陣列,含有10個整數元素 也就是說每乙個元素都是整數 指標陣列 int p 10 指標陣列,含有10個指標元素 也就是說每乙個元素都是指標 陣列指標 int p ...

指標,陣列指標,指標陣列

1.指標 指標可以看成乙個變數,指標所佔記憶體的大小和處理器的定址空間大小有關,32位處理器指標大小為4個位元組,64位處理指標大小為8個位元組。int p 定義乙個int型別的指標,p就可以看成乙個變數,p的值為0,表示p指向0位址 p也是占用記憶體的,編譯器在棧上為p分配記憶體,儲存p的值0,0...