指標陣列和陣列指標

2021-05-28 14:30:42 字數 3277 閱讀 7414

指標陣列和陣列指標

呵呵,實在是厭倦了繞口的解釋。

指標陣列,故名思義,就是指標的陣列,陣列的元素是指標;

陣列指標,同樣,就是直想陣列的指標。

簡單舉例說明:

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 = π

這樣定義之後,表示式*ppipi的值,表示式**ppii的值。請讀者自己畫圖理解ipippi這三個變數之間的關係。

很自然地,也可以定義指向「指向指標的指標」的指標,但是很少用到:

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 -lls -r列印不同的檔案列表,而有些程式會根據不同的argv[0]做不同的事情,例如專門針對嵌入式系統的開源專案busybox,將各種linux命令裁剪後集於一身,編譯成乙個可執行檔案busybox,安裝時將busybox程式拷到嵌入式系統的/bin目錄下,同時在/bin/sbin/usr/bin/usr/sbin等目錄下建立很多指向/bin/busybox的符號鏈結,命名為cplsmvifconfig等等,不管執行哪個命令其實最終都是在執行/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本身...