對於指標陣列和陣列指標,單從字面上似乎很難分清它們是什麼,先來看看指標陣列和陣列指標各自的定義形式。
指標陣列的定義形式為:(是乙個陣列)
型別名 * 陣列名[ 陣列長度];
如: int *p[8];
陣列指標的定義形式為:(是乙個指標)
型別名 (* 指標名)[ 陣列長度];
如: int (*p)[8];
現在來分析上述兩種定義形式,通過「int *p[8];」這條定義語句可以定義乙個指標陣列。因為優先順序的關係,所以p 先與 結合,說明p 是乙個陣列,然後再與* 結合說明陣列p 的元素是指向整型資料的指標。元素分別為p[0], p[1], p[2], ...,p[7],相當於定義了8 個整型指標變數,用於存放位址單元,在此,p 就是陣列元素為指標的陣列,本質為陣列。如果使用的定義方式為「int (*p)[8];」, p 先與* 號結合,形成乙個指標,該指標指向的是有8 個整型元素陣列,p 即為指向陣列首元素位址的指標,其本質為指標。介紹了指標陣列和陣列指標的含義,接下來,我們通過下面一段**來看看指標陣列和陣列指標如何訪問二維陣列。(這裡使用右左法則,通過變數先看右邊,再看左邊)
[cpp] view plaincopy在code上檢視**片派生到我的**片
include
void main(int argc,char *ar**)
; int (*p1)[4];
int *p2[4];
int i,j,k;
p1=arr;
printf("使用陣列指標的方式訪問二維陣列arr\n");
for(i=0;i<4;i++)
printf("\n");
} printf("使用指標陣列的方式訪問二維陣列arr\n");
for(k=0;k<4;k++)
for(i=0;i<4;i++)
printf("\n");
} return;
}
fengpeng@ubuntu:~/workspace/work1$ ./test
使用陣列指標的方式訪問二維陣列arr
arr[0][0]=0 arr[0][1]=1 arr[0][2]=2 arr[0][3]=3
arr[1][0]=4 arr[1][1]=5 arr[1][2]=6 arr[1][3]=7
arr[2][0]=8 arr[2][1]=9 arr[2][2]=10 arr[2][3]=11
arr[3][0]=12 arr[3][1]=13 arr[3][2]=14 arr[3][3]=15
使用指標陣列的方式訪問二維陣列arr
arr[0][0]=0 arr[0][1]=1 arr[0][2]=2 arr[0][3]=3
arr[1][0]=4 arr[1][1]=5 arr[1][2]=6 arr[1][3]=7
arr[2][0]=8 arr[2][1]=9 arr[2][2]=10 arr[2][3]=11
arr[3][0]=12 arr[3][1]=13 arr[3][2]=14 arr[3][3]=15
我們成功地使用陣列指標和指標陣列的方式訪問了二維陣列,在分析它們各自的訪問方式之前,先通過下圖了解二維陣列中元素的存放方式。
在分析指標陣列和陣列指標如何訪問二維陣列中的各個元素之前,我們要明白二維陣列每行的起始位址並不是只能用圖1-5 中的那種表示方式,還有很多方法可以表示每行的起始位址,如*(arr+i) 和arr+i 等。為了幫助讀者更好地記憶,我們通過下面一段**來學習其他表示二維陣列每行起始位址的方式。
#include
void main(int argc,char *ar**)
; int i;
for(i=0;i<4;i++)
return;
} fengpeng@ubuntu:~/workspace/work1$ ./test
使用arr+i 求得二維陣列arr 第1 行的起始位址為:1244996
使用arr[i] 求得二維陣列arr 第1 行的起始位址為:1244996
使用*(arr+i) 求得二維陣列arr 第1 行的起始位址為:1244996
使用&arr[i] 求得二維陣列arr 第1 行的起始位址為:1244996
使用arr+i 求得二維陣列arr 第2 行的起始位址為:1245012
使用arr[i] 求得二維陣列arr 第2 行的起始位址為:1245012
使用*(arr+i) 求得二維陣列arr 第2 行的起始位址為:1245012
使用&arr[i] 求得二維陣列arr 第2 行的起始位址為:1245012
使用arr+i 求得二維陣列arr 第3 行的起始位址為:1245028
使用arr[i] 求得二維陣列arr 第3 行的起始位址為:1245028
使用*(arr+i) 求得二維陣列arr 第3 行的起始位址為:1245028
使用&arr[i] 求得二維陣列arr 第3 行的起始位址為:1245028
使用arr+i 求得二維陣列arr 第4 行的起始位址為:1245044
使用arr[i] 求得二維陣列arr 第4 行的起始位址為:1245044
使用*(arr+i) 求得二維陣列arr 第4 行的起始位址為:1245044
使用&arr[i] 求得二維陣列arr 第4 行的起始位址為:1245044
在上面的**中,我們使用了4 種方式來獲得每行的起始位址,因此行起始位址的表示方式並不唯一,讀者在使用的時候可以自行選擇。
下面接著講解陣列指標和指標陣列是如何訪問二維陣列的,先看陣列指標的訪問方式。因為陣列指標指向的是乙個有4 個整型元素的陣列,所以可以把二維陣列arr 看成由4 個元素arr[0],arr[1], arr[2],arr[3] 組成,每個元素都是含有4 個整型元素的一維陣列,所以當在**中使用p1=arr 的時候,p1 就指向了二維陣列的第一行的首位址。在接下來的訪問中,由於p1 指向的型別是int [4],所以從p1 到p1+1 的變化值為44 個位元組,即p1+1=1245012。從前面的執行結果中可以發現,p1+1 剛好指向第二行的起始位址。至於為什麼剛好能指向二維陣列arr 的第二行的首位址,這個問題將在第4 章進行講解。通過p1+i 剛好能夠取遍每行的起始位址,有了每行的起始位址之後,就可以通過「*(*(p1+i)+j)」來取出二維陣列中每行的每乙個元素。指標陣列的訪問方式要更容易一些,因為定義的指標陣列p2 由4 個元素p2[0],p2[1],p2[2], p2[3] 組成,每個元素都是乙個整型指標,所以只需要在程式中取出每行的起始位址並放到p2 指標陣列對應的元素中,就可以訪問二維陣列arr 中的元素了。所以,在程式中使用指標陣列和陣列指標的時候,必須對它們有清晰的認識,要知道它們的本質是什麼,以及如何使用。
c語言基礎必備 指標陣列 and 陣列指標
對於指標陣列和陣列指標,單從字面上似乎很難分清它們是什麼,先來看看指標陣列和陣列指標各自的定義形式。指標陣列的定義形式為 是乙個陣列 型別名 陣列名 陣列長度 如 int p 8 陣列指標的定義形式為 是乙個指標 型別名 指標名 陣列長度 如 int p 8 現在來分析上述兩種定義形式,通過 int...
C語言基礎 指標陣列與陣列指標
一 指標陣列 在這一節中我們來學習乙個陣列,這個陣列比較特殊,也比較普通。說它特殊是因為這個陣列是指標的陣列,也就是說我們有乙個陣列,這個陣列裡存放的變數型別是指標型變數 說它普通是因為陣列變數其實與其它普通變數沒有什麼區別,指標變數就是一種可以存放記憶體位址的變數,所以它們也可以被定義成一串連續的...
C語言基礎 指標陣列(指向陣列的指標)
陣列 array 是一系列具有相同型別的資料的集合,每乙份資料叫做乙個陣列元素 element 陣列中的所有元素在記憶體中是連續排列的,整個陣列占用的是一塊記憶體。定義陣列時,一定要給出陣列名,陣列名可以認為是乙個指標,它指向陣列的第 0 個元素。在c語言中,我們將第 0 個元素的位址稱為陣列的首位...