c語言基礎必備 指標陣列 and 陣列指標

2021-06-19 10:52:09 字數 3536 閱讀 7216

對於指標陣列和陣列指標,單從字面上似乎很難分清它們是什麼,先來看看指標陣列和陣列指標各自的定義形式。

指標陣列的定義形式為:(是乙個陣列)

型別名 * 陣列名[ 陣列長度];

如: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 即為指向陣列首元素位址的指標,其本質為指標。介紹了指標陣列和陣列指標的含義,接下來,我們通過下面一段**來看看指標陣列和陣列指標如何訪問二維陣列。(這裡使用右左法則,通過變數先看右邊,再看左邊)

include void main(int argc,char *argv)

; 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 *argv)

; 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 個元素的位址稱為陣列的首位...