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