指针数组
概念:
一个数组的元素值为指针则是指针数组。 指针数组是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
指针数组说明的一般形式为:
类型说明符 *数组名[数组长度]
其中类型说明符为指针值所指向的变量的类型。
例如:
int *pa[3]
表示pa是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量。
1、用一个指针数组来指向一个二维数组。
指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组。
示例代码:
#include<stdio.h> main(){ int a[3][3]={ 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));}
本例程序中,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]均为指针变量。
2、指针数组表示一组字符串并用作函数参数
示例代码1:
#include<stdio.h> void main(){ char *day_name(char *name[],int n); static char *name[]={ "Illegal day", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; char *ps; int i; printf("input Day No:\n"); scanf("%d",&i); if(i<0) exit(1); ps=day_name(name,i); printf("Day No:%2d-->%s\n",i,ps);}char *day_name(char *name[],int n){ char *pp1,*pp2; pp1=*name; pp2=*(name+n); return((n<1||n>7)? pp1:pp2);}
示例代码2:
#include<string.h> #include<stdio.h>main(){ void sort(char *name[],int n); void print(char *name[],int n); static char *name[]={ "CHINA","AMERICA","AUSTRALIA", "FRANCE","GERMAN"}; int n=5; sort(name,n); print(name,n);}void sort(char *name[],int n){ char *pt; int i,j,k; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(strcmp(name[k],name[j])>0) k=j; if(k!=i) { pt=name[i]; name[i]=name[k]; name[k]=pt; } }}void print(char *name[],int n){ int i; for (i=0;i<n;i++) printf("%s\n",name[i]);}
应注意指针数组和二维数组指针变量的区别。这两者虽然都可以用来表示二维数组,但是其表示方法和意义
是完全不同的。
二维数组指针变量
二维数组指针变量是单个的变量,例如 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]的值。
示例代码:
#include<stdio.h> void main(){ void average(float *p,int n); void search(float (*p)[4],int n); float score[3][4]={ { 65,67,70,60}, { 80,87,90,81}, { 90,99,100,98} }; average(*score,12); //求12个学生平均数 search(score,2); //求序号为2的学生成绩}void average(float *p,int n){ float *p_end; float sum=0,aver; p_end=p+n-1; for( ; p<=p_end ; p++) sum+=(*p); aver=sum/n; printf("average= %5.2f \n",aver);}void search(float (*p)[4],int n) //p是指向具有4个元素的一维数组的指针{ int i; printf("The score of No.%d are :\n",n); for(i=0;i<4;i++) printf("%5.2f ",*(*(p+n)+i)); printf("\n");}
附件列表