指針數組
概念:
一個數組的元素值為指針則是指針數組。 指針數組是一組有序的指針的集合。 指針數組的所有元素都必須是具有相同存儲類型和指向相同數據類型的指針變量。
指針數組說明的一般形式為:
類型說明符 *數組名[數組長度]
其中類型說明符為指針值所指向的變量的類型。
例如:
int *pa[3]
表示pa是一個指針數組,它有三個數組元素,每個元素值都是一個指針,指向整型變量。
1、用一個指針數組來指向一個二維數組。
指針數組中的每個元素被賦予二維數組每一行的首地址,因此也可理解為指向一個一維數組。
#include<stdio.h> main() { int a[3][3]={1,2,3,4,5,6,7,8,9};//1 2 3
//4 5 6
//7 8 9 int *pa[3]={a[0],a[1],a[2]};//指針數組 int *p=a[0]; int i; for(i=0;i<3;i++) printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a+i)+i));//見總結 for(i=0;i<3;i++) printf("%d,%d,%d\n",*pa[i],p[i],*(p+i)); }
總結:1:二維數組中這里的a是“指向包含三個元素的數組指針(地址)”a+1也一樣;*(a+1)=a[1],
這里的+1表示跨越了三個元素,這就是跨過了第一行。
而a[1]相當於a[1][0]的數組名,也就是第二行第一列的首地址,*(a+1)也一樣,則*a[1]=a[1][0],
**(a+1)=a[1][0]=*a[1].
2:而*(*(a+i)+i),后面的i是表示往后移動i個元素,聯想*(p+i)一維時。
輸出結果
3,1,1
5,4,5
7,7,9
1,1,1
4,2,2
7,3,3
本例程序中,pa是一個指針數組,三個元素分別指向二維數組a的各行。然后用循環語句輸出指定的數組元素。
*pa[i]表示i行0列元素值,由於p與a[0]相同,故p[i]表示0行i列的值,*(p+i)表示0行i列的值。
int *p[3]表示p是一個指針數組,有三個下標變量p[0],p[1],p[2]均為指針變量。
二維數組指針變量
二維數組指針變量是單個的變量,例如 int (*p)[4]表示p是一個指針變量,它指向包含4個整型元素的一維數組。
int (*p)[4]; 表示*p有4個元素,每個元素為整型。也就是p所指的對象是有4個整型元素的數組,即p是指向一維數組的指針。此時p只能指向一個包含4個元素的一維數組,p的值就是一維數組的起始地址。p不能指向一維數組中的某一元素。
int a[3][4];
int (*p)[4];
p=a;
由於p是指向二維數組的0行元素,因此p+i是二維數組a的i行的起始地址。*(*(p+2)+3)是a[2][3]的值。
1 #include<stdio.h> 2 void main() 3 {
4 void average(float *p,int n); 5 void search(float (*p)[4],int n); 6
7 float score[3][4]={ 8 {65,67,70,60}, 9 {80,87,90,81}, 10 {90,99,100,98}
11 }; 12
13 average(*score,12); //求12個學生平均數,*score傳的是第一行第一列首地址。 14 search(score,2); //求序號為2的學生成績 15 } 16
17 void average(float *p,int n) 18 {
19 float *p_end; 20 float sum=0,aver; 21
22 p_end=p+n-1; 23 for( ; p<=p_end ; p++) 24 sum+=(*p); 25 aver=sum/n; 26
27 printf("average= %5.2f \n",aver); 28 }
29
30 void search(float (*p)[4],int n) //p是指向具有4個元素的一維數組的指針 31 {
32 int i; 33 printf("The score of No.%d are :\n",n);
34
35 for(i=0;i<4;i++) 36 printf("%5.2f ",*(*(p+n)+i)); 37 printf("\n"); 38 }
#include<stdio.h> void main() { int i; int score[3][4]={ {65,67,70,60}, {80,87,90,81}, {90,99,100,98} }; int (*p)[4]=score; for(i=0;i<12;i++) { printf("%d ",*(*p+i));//二維數組本身就是在內存就是一位線性排列。 } }//輸出為65,67,70依次順序輸出
