#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...