指標陣列 與陣列指標

2021-06-19 19:25:54 字數 3652 閱讀 5081

#define max 10 

char* ch1[max];// max個字串 (指標陣列)

(char*)  ch2[max];//錯誤 在vc6上編譯不過

char (* ch3)[max];//含有max個字元的指標;即陣列指標

ch3=(char 

(*)[12])malloc(12); 

orch3 = &ch1; 

ch1=;

ch3 =; //錯誤 在vc6上編譯不過

部分摘自: 

int *p[2]; 首先宣告了乙個陣列,陣列的元素是int型的指標。

int (*p)[2]; 宣告了乙個指標, 指向了乙個有兩個int元素的陣列。

通常,對於int a[8][9]這個二維陣列,我們可以這樣定義乙個指向它的指標:

int (*p)[9];

這個宣告的形式跟人們所熟悉的int *p的形式大相庭徑,初學者通常會感到迷惑,不理解的地方大致有四個:

1。為什麼會以這種形式宣告?

2。(*p)應該如何理解?

3。為什麼必須把第二維顯式地宣告?

4。為什麼忽略第一維?

下面我們就一起逐個討論這四個問題:

1。這種形式是c標準的宣告語法規定的,由於本章不是對標準的解釋,只是對標準的應用,因此筆者盡量以簡潔的方式解釋這個宣告,詳細的討論將在第七章進行。c標準的宣告包含了兩部分:

宣告:宣告說明符 

初始化宣告符表opt 

(opt的意思是可選)

在宣告說明符裡面有一項型別說明符,int就是這種型別說明符。而初始化宣告符表裡面的其中一種形式,就是:

直接宣告符 [常量表示式opt]

(*p)[9]就是這種直接宣告符加的形式。

2。p左邊的*在這裡不是取值運算子,而是乙個宣告符,它指出p是乙個指標。而()括號是不能去掉的,如果去掉了,由於運算子優先順序比*高,p就會先跟結合,這樣p就變成了乙個指標陣列,而不是指向陣列的指標。

題外話:

*p還有一種用法,就是當*是取值運算子的時候,*p是乙個左值,表示乙個變數,為什麼*p是乙個變數呢?也許有人會說,因為int i, *p=&i嘛,其實這是結果不是原因。嚴格來說,i只是乙個變數名,不是變數,在編譯器的符號表裡面,變數名是乙個符號位址,它所代表的位址值是它指向的那段記憶體單元的位址,真正叫變數的是那段記憶體單元,懂彙編的朋友能很容易地區分出來,在彙編裡面,可以這樣定義乙個變數名:

varw 

dw 10,20

varw就是乙個變數名,它在彙編裡面是乙個位址,代表了10所在的記憶體單元這個變數。由於p被初始化為&i,*p指向i所代表的那段記憶體單元,因此說*p是乙個變數。把i稱為變數是一種習慣上的統稱。

3。定義乙個指標的時候,首先必須定出指標的型別,由於這是乙個指向陣列的指標,如果陣列的元素的型別定下來了,那麼這個指標的型別也就定下來了。前面說過,c語言的多維陣列實質上是陣列的巢狀,那麼所指向陣列的元素必定具有陣列型別,也就是說,這個陣列的元素是乙個具有6個int元素的陣列,因此,p定義的時候,必須指定第二維的上界,這樣才能把p的型別定下來。

4。有這種疑問的人已經犯了乙個錯誤,沒有分清楚什麼是指標,什麼是陣列,以陣列的思維模式來看待這個指標p。定義乙個陣列(非static)的時候,需要在棧中靜態分配一塊記憶體,那麼就需要知道這塊記憶體的大小,因此定義陣列時需要確定各維的上界。而這裡只是定義乙個指標而已,對於乙個指標的定義,需要知道的是它所指向物件的型別,並不需要知道物件的大小,這是多餘的。因此,所有指向陣列的指標的第一維被忽略。

以上介紹了如何宣告乙個指向二維陣列的指標,類似地,對乙個指向n維陣列的指標也可以用同樣的方法來宣告,如下:

int (*p)[x2][x3]......[xn];

同樣可以忽略第一維,而其它維必須指定上界。

最後再討論一種很常見的對多維陣列的錯誤理解,有些人常常會以為,二維陣列就是二級指標,這種錯誤的根源,來自於可以把乙個二級指標int **p以p[i][j]這種形式使用。首先把陣列稱為指標就是錯誤的,第一章筆者已經說明了陣列名是位址,不能理解為指標。第二,並非能以p[i][j]這種形式使用,那麼p就是乙個二維陣列了,c標準對陣列引用的規定,並沒有指定陣列引用時運算子的左邊必須是陣列名,而可以是乙個表示式。第三,這是一種「巧合」,歸根到底是由於c語言的陣列實現是陣列的巢狀同時c標準把運算子轉換為類似*(*(a+i)+j)這樣的等價表示式造成的,那兩個取值運算子「恰好」可以用於乙個二級指標。第四,p與p[i]並不具有陣列型別,sizeof(p)和sizeof(p[i])的結果只是乙個指標的大小4位元組。而對於乙個真正的陣列,p與p[i]都是具有陣列型別的位址。

實際上,int **p只是乙個指向一維指標陣列的指標,而不是指向二維陣列的指標。同樣地,對於n級指標,都可以看作乙個指向一維指標陣列的指標,這個指標陣列的元素都是n-1級指標。

【huashizhixin】:

乙個指向十個int元素的指標

可以這樣賦值:int b[10]=;//必須是十個元素

p=&b;

【huashizhixin】:

(i)int *p[3]; 

(ii)int (*q)[3]; 

(iii)int *(t[3]); 

以上三者的區別?(vc++環境下驗證): 

(1)p是乙個指標陣列,此處包含三個整型指標,所以sizeof(p)=12;sizeof(*p)=4;//首位址 

(2)q是乙個陣列指標,指向含有三個元素的整型陣列,所以sizeof(q)=4;sizeof(*q)=12; 

(3) 和(1)一樣;sizeof(t)=12;sizeof(*t)=4; 

(4)   int *p[3]等價於:typedef 

int* 

myint; 

myint 

p[3]; 

int (*p)[3]等價於:typedef 

int 

intarray[3]; 

intarray 

*p; 

(5)   (i)可以這樣初試化:int  a[]={1,2,3,4}; 

p[0]=a;//*p=a;  

(ii)可以這樣初始化:int  a[3]={1,2,3};//陣列元素必須是三個 

q =&a; 

(6)p是陣列,不可做++操作,q是指標,可以做++操作,q++是當前q指向的位址值加12;

【hongliuhongwei】:

謝謝大家,能不能給我乙個使用的例子啊,我是在使用的時候,編譯能通過,一執行就有問題,沒有結果,謝謝!

【huashizhixin】:

vc6.0

#include"stdio.h"

main(int argc, 

char *argv[ ])

;int (*p)[3];

p=&b;

for(int i=0;i<3;i++)

printf("]",*(*p+i));

}【cuibo1123】:

int (*p)[10]

整形 指標 10個元素

意思就是乙個指標,可以指向包含10個整形元素的東西~

int main(void)

;//5行10列的陣列(也就是5個 

《包含10個整形元素》 的陣列)

int (*p)[10];//可以指向包含10個整形元素的指標(他的基型別是sizeof(int)*10)

p=a;

printf("%d",p[0][0]);

return 0;}

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

int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...

陣列 指標陣列與陣列指標

一 陣列型別 int a 10 printf a d,a 1 d n a,a 1 printf a d,a 1 d n a,a 1 輸出結果 2 陣列元素的首位址是常量,不能修改,這是為了釋放記憶體空間所必需的,否則找不到釋放記憶體空間的首位址了 3 定義乙個陣列型別 定義陣列型別的格式如下 typ...

指標陣列與陣列指標

1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...