指標陣列與陣列指標

2021-08-02 11:17:03 字數 2630 閱讀 4218

在c語言中有兩個總是讓人迷惑的概念:指標陣列與陣列指標,這裡簡單的解釋一下

指標陣列的理解

指標陣列著重點在後兩個字,陣列,對,這就是乙個陣列,只不過不同於其他陣列,該陣列的每個成員都為指標,這裡可以將指標視為一種資料型別,這個資料型別包含char *, int *,short *…等,這樣可以同其它陣列一樣來理解(整形陣列,字元陣列…,這裡為指標陣列),指標型別的乙個陣列

指標陣列的定義

指標陣列的定義相對簡單:

char *p

[10];

這裡由於[ ]的優先順序高於*,所以p會先與[ ]結合,這就使得p為乙個陣列,然後再定義該陣列為什麼型別(char *)

陣列指標的理解

陣列指標的著重點同樣在後兩個字,指標,這裡為乙個指標,只不過該指標指向乙個陣列,這裡可以將陣列理解為一種資料型別,陣列指標就是利用該型別建立的乙個指標變數。

陣列指標的定義

相對於指標陣列,陣列指標的定義方法就比較多,主要有如下三種:

第一種

typedef int a[10];

a *a

;int b[10];

a = &b;

這裡為先定義乙個陣列型別,再用該型別來定義乙個該型別的指標變數(陣列指標變數),然後讓該變數指向乙個相同型別大小的陣列。

這類解釋一下為什麼要用&b,我們知道,我們定義的a位指向乙個一維陣列的指標,而一維陣列名表示的位首元素位址,為我們要的是整個一維陣列的首位址,所以這裡對一維陣列取位址,就位整個一維陣列的位址,但由於一維陣列首元素位址和整個一維陣列的位址相同,所以不加&會warning不會報錯,不推薦使用。

同樣,這裡如果定義乙個二維陣列的話,可以不加&,二維陣列陣列名就表示二維陣列的首元素位址,即一維陣列的位址(二維陣列的元素就是一維陣列)

第二種

typedef int (*a)[10];aa

;int b[10];

a = &b;

這裡是直接定義了乙個陣列指標型別,再定義陣列指標變數。注意,這裡的定義與指標陣列的定義相似,這裡由於是要定義乙個指標,所以使用( )將其優先順序打亂,這裡( )與[ ]優先順序相同, 從左向右結合,即a為乙個指標型別

這裡還有一種不常見的情況,指向一維陣列的指標只能指向一維或二維陣列(一維陣列使用&轉換為整個一維陣列的位址,二維陣列名就表示首一維陣列位址),若想指向乙個三維陣列(元素為二維陣列)就要使用指向二位陣列的指標int (*a)[10][10],(可以想象三維陣列為三顆*,指向二位陣列的指標也為三顆*)

第三種

int (*a)[10];

int b[10];

a = &b;

這一種與上一中類似,這裡是直接定義了乙個陣列指標型別,上面一種是先定義陣列指標型別,再拿型別定義變數

比較常用的位第二種與第三種

指標陣列

指標陣列的使用與普通陣列的使用基本相同,當然並不能直接給每個元素賦值,它的每個元素都是指標,儲存著乙個位址,亂賦值程式就會崩潰

int *a[3];

a[0] = (int *)malloc(sizeof(int));

*a[0] = 10;

int b[10] = ;

a[1] = b;

a[1][4] = 5;

這裡第乙個是將乙個指標陣列內的第1個元素指向堆區分配的乙個int記憶體,然後為其賦值

第二個是讓他指向乙個相同型別的陣列,然後就可以對陣列內的元素進行操作

陣列指標

陣列指標的使用類似於多維陣列,這裡只分析指向一維陣列的指標(char (*a)[10]),我們知道指向一維陣列的指標可以指向一維陣列,同樣可以指向二維陣列,所以這裡有分為兩種情況

指向一維陣列

char (*a)[10];

char b [10] = "abcde";

a = &b;

printf("%c

%c%c\n", **a, *(

*a + 1), (*a)[2]);

這裡a表示為指向整個一維陣列,所以使用*來讓其表示指向一維陣列首元素位址(a = &b –> *a = *(&b) –> *a = b),然後再用*取值,就是字元

這種情況在使用時一定要給指標名繫結乙個 * ,讓其跟指標名先結合,這樣在操作時才能減少出錯

指向二維陣列

char (*a)[10];

char b[2][10] = ;

a = b;

printf("%c %c %s\n", *(*(a + 1) + 1), a[1][1], a[1]);

讓乙個指向一維陣列的指標指向乙個二維陣列,使用時就像在使用陣列本身一樣

在解釋一下為什麼能指向二維陣列,這裡是將 a = b ,b是二維陣列名,表示首元素位址,二維陣列的元素為一維陣列,所以這裡型別正好匹配

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

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