指標陣列和陣列指標
呵呵,實在是厭倦了繞口的解釋。
指標陣列,故名思義,就是指標的陣列,陣列的元素是指標;
陣列指標,同樣,就是直想陣列的指標。
簡單舉例說明:
int *p[2]; 首先宣告了乙個陣列,陣列的元素是int型的指標。
int (*p)[2]; 宣告了乙個指標, 指向了乙個有兩個int元素的陣列。
其實這兩種寫法主要是因為運算子的優先順序, 因為的優先順序比*高。所以第一種寫法,p先和結合,所以是乙個陣列,後與*結合,是指標。後一種寫法同理。
指標陣列如下處理就會很清楚:
typedef int* intptr;
intptr p[2];
一目了然,所以為了避免迷惑,做適當的typedef也是很有必要的。
同理,陣列指標也可以作類似處理:
typedef int intarray2[2];
intarray2 * p;
和原來的宣告都是等價的。
個人建議程式設計過程中採用typedef來進行型別定義,這樣程式看起來會清晰很多。舉個例子說明:
陣列指標,元素為指向陣列的指標:)
首先,指向陣列的指標為:
typedef intarray2* intarray2ptr;
然後是乙個陣列的元素:
typede intarray2ptr intarray2ptrarr3[3];
最後陣列的指標:
intarray2ptrarr3 *p;
呵呵,寫到這裡自己也有點暈了,反正我工作以來從來沒有寫過這麼拗口的程式,僅作參考,實際應用價值不大。
但是開題所提到兩種情況應該是比較常見的。另外就是函式指標。另外詳述。
指向指標的指標與指標陣列 請點評
指標可以指向基本型別,也可以指向復合型別,因此也可以指向另外乙個指標變數,稱為指向指標的指標。
int i;這樣定義之後,表示式int *pi = &i;
int **ppi = π
*ppi
取pi
的值,表示式**ppi
取i
的值。請讀者自己畫圖理解i
、pi
、ppi
這三個變數之間的關係。
很自然地,也可以定義指向「指向指標的指標」的指標,但是很少用到:
int ***p;陣列中的每個元素可以是基本型別,也可以復合型別,因此也可以是指標型別。例如定義乙個陣列
a
由10個元素組成,每個元素都是int *
指標:
int *a[10];這稱為指標陣列。
int *a[10];
和int **pa;
之間的關係類似於int a[10];
和int *pa;
之間的關係:a
是由一種元素組成的陣列,pa
則是指向這種元素的指標。所以,如果pa
指向a
的首元素:
int *a[10];則int **pa = &a[0];
pa[0]
和a[0]
取的是同乙個元素,唯一比原來複雜的地方在於這個元素是乙個int *
指標,而不是基本型別。
我們知道main函式的標準原型應該是int main(int argc, char *argv);
。argc
是命令列引數的個數。而argv
是乙個指向指標的指標,為什麼不是指標陣列呢?因為前面講過,函式原型中的表示指標而不表示陣列,等價於
char **argv
。那為什麼要寫成char *argv
而不寫成char **argv
呢?這樣寫給讀**的人提供了有用資訊,argv
不是指向單個指標,而是指向乙個指標陣列的首元素。陣列中每個元素都是char *
指標,指向乙個命令列引數字串。
例 23.2. 列印命令列引數
#include int main(int argc, char *argv)
編譯執行:
$ gcc main.c$ ./a.out a b c
argv[0]=./a.out
argv[1]=a
argv[2]=b
argv[3]=c
$ ln -s a.out printargv
$ ./printargv d e
argv[0]=./printargv
argv[1]=d
argv[2]=e
由於argv[4]
是null
,我們也可以這樣迴圈遍歷argv
:
for(i=0; argv[i] != null; i++)
null
標識著argv
的結尾,這個迴圈碰到null
就結束,因而不會訪問越界,這種用法很形象地稱為sentinel,null
就像乙個哨兵守衛著陣列的邊界。
在這個例子中我們還看到,如果給程式建立符號鏈結,然後通過符號鏈結執行這個程式,就可以得到不同的argv[0]
。通常,程式會根據不同的命令列引數做不同的事情,例如ls -l
和ls -r
列印不同的檔案列表,而有些程式會根據不同的argv[0]
做不同的事情,例如專門針對嵌入式系統的開源專案busybox,將各種linux命令裁剪後集於一身,編譯成乙個可執行檔案busybox
,安裝時將busybox
程式拷到嵌入式系統的/bin
目錄下,同時在/bin
、/sbin
、/usr/bin
、/usr/sbin
等目錄下建立很多指向/bin/busybox
的符號鏈結,命名為cp
、ls
、mv
、ifconfig
等等,不管執行哪個命令其實最終都是在執行/bin/busybox
,它會根據argv[0]
來區分不同的命令。
指標陣列和陣列指標
有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...
指標陣列和陣列指標
理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...
指標陣列和陣列指標
該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...