目录
5.指针与二维数组
(1)二维数组和数组元素的地址
C语言的二维数组由若干个一维数组构成。即先把二维数组视为一个一维数组,而每个一维数组的每一个元素又是一个一维数组。例如:
int a[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
理解:
①数组a由3个元素组成,即a[0] a[1] a[2],数组名a就是一维数组a[0] a[1] a[2]的首地址。
②数组a的每一个元素又是一个一维数组,都包含5个元素。所以,在C语言中,二维数组名a同样是二维数组的首地址,即a[0][0]的地址。
③a是第0行的首地址,a+1是第1行的首地址,a+2是第2行的首地址。

由于a[0] a[1] a[2] 是一维数组名,它们就是对应数组的首地址。
a[0]的首地址是&a[0][0],a[1]的首地址是&a[1][0],a[i]+j 就是第i行第j列元素的地址a[i][j]
等价规则:
a[0] <=> *(a+0)
a[1] <=> *(a+1)
a[i]+j <=> *(a+i)+j <=>&a[i][j]
(2)通过地址存取二维数组元素
*(a[i]+j) <=> a[i][j]
*(*(a+i)+j) <=> a[i][j]
(*(a+i))[j] <=> a[i][j]
*(&a[0][0]+5*i+j) <=> *(a[0]+5*i+j) <=> *(*a+5*i+j) <=> a[i][j]
#include<stdio.h>
int main(){
int i,j;
int a[][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
printf("%5d",*(a[1]+4));
printf("%5d\n",--*(*a+3));
(*(a+1))[1]+=5;
*(&a[0][0]+5*2+3)=55;
for(i=0;i<3;i++){
for(j=0;j<5;j++)
printf("%5d",a[i][j]);
printf("\n");
}
return 0;
}
(3)通过指向数组元素的指针变量存取二维数组元素举例
#include<stdio.h>
int main(){
int i,j,*p,a[][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
p=*a;
printf("%5d ",*(p+2*5));
printf("%5d\n",(*(p+8))++);
*(p+14)+=*(p+2*5+3);
for(i=0;i<3;i++){
for(j=0;j<5;j++)
printf("%5d",a[i][j]);
printf("\n");
}
return 0;
}
(3)通过指向一维数组的指针变量存取二维数组元素
假设有程序语句:
int a[3][5],i,j,(*pi)[5];
pi=a;
其中(*pi)[5] <=> a[0][5]
a[i][j] <=> * (pi[i]+j) <=> ( * (pi+i)+j) <=> ( * (pi+i))[j] <=>pi[i][j] <=> a[i][j]
(4)输出二维数组的指定行和指定列
#include<stdio.h>
int main(){
int a[][5]={1,2,4,5,6,7,8,9,10,11,12,13,14,15};
int i,row,col,(*p)[5];
p=a;
printf("请输入二维数组的行(0~2)、列(0~4):\n");
scanf("%d%d",&row,&col);
printf("第%d行的数组元素是:",row);
for(i=0;i<3;i++){
printf("%5d",*(*(p+row)+i));
}
printf("第%d列的数组元素是:",col);
for(i=0;i<3;i++) printf("%5d",*(p[i]+col));
return 0;
}
(5)通过指针数组存取二维数组元素
假如有如下程序语句:
int a[3][5],i,j,*pa[3];
for(i=0;i<3;i++) pa[i]=a[i];
for循环语句把二维数组a每行第0列元素的首地址a[i]赋值给指针变量p[i]
等价关系:*(pa[i]+j) <=> * ( * (pa+i)+j) <=> ( * (pa+i) )[j] <=> pa[i][j] <=> a[i][j]
实例:某班有4个学生,5门课程。编写程序求第3门课程的平均分,并按总分由大到小排序,输出每位学生的学号、成绩和总分。
#include<stdio.h>
int main(){
int i,j;
float *pa[4],*temp,average=0;
float score[][7]={
{1,76.5,89.5,78,90.5,66,0.0},
{2,56.5,69.5,49,70.5,73,0.0},
{3,82,90,87.5,90.5,81.5,0.0},
{4,67,69.5,43,70.5,52.5,0.0}
};
for(i=0;i<4;i++)
pa[i]=score[i];
for(i=0;i<4;i++)
average+=*(pa[i]+3);
average/=4.0;
printf("第3门课的平均分是:%6.2f\n",average);
for(i=0;i<4;i++)
for(j=1;j<6;j++)
pa[i][6]+=(*(pa+i))[j];
for(i=0;i<3;i++)
for(j=0;j<=2-i;j++)
if(pa[j][6]<pa[j+1][6]){
temp=pa[j];
pa[j]=pa[j+1];
pa[j+1]=temp;
}
for(i=0;i<4;i++){
printf("第%.0f号学生的成绩为:",pa[i][0]);
for(j=1;j<6;j++) printf("%-8.2f",*(*(pa+i))+j);
printf("总分为:%6.2f\n",pa[i][6]);
}
return 0;
}
(6)通过二维数组构成字符串数组
例如:
char *ps[5]={"asdf","gfdg","efgbdfds"};
printf("%s,%c\n",ps[4],ps[2][1]);
①编写程序,输入数字星期几,则输出英文对应的星期几。例如,输入“0”,则输出“Sunday”,若输入“6”,则输出“Saturday”。
#include<stdio.h>
int main(){
char weeks[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int i;
do{
printf("请输入星期几(数字0~6):\n");
scanf("%d",&i);
}while(i<0||i>6);
printf("%s\n",weeks[i]);
return 0;
}
②将字符串“BASIC”、“ADA”、“Pascal”、“C”、“Fortran”,按从小到大的顺序排序后输出。
#include<stdio.h>
#include<string.h>
int main(){
char *temp,*ps[5]={"BASIC","ADA","Pascal","C","Fortran"};
int i,j,k;
for(i=0;i<4;i++){
k=i;
for(j=i+1;j<5;j++)
if(strcmp(ps[k],ps[j])>0)
k=j;
if(k!=i){
temp=ps[i]; ps[i]=ps[k]; ps[k]=temp;
}
}
for(i=0;i<4;i++) printf("%s ",ps[i]);
printf("%s\n",ps[4]);
return 0;
}
本文详细探讨了C语言中指针与二维数组的关系,包括二维数组的地址理解,如何通过地址存取元素,使用指向一维数组的指针变量操作二维数组,输出指定行和列,通过指针数组存取元素,以及二维数组构成字符串数组的应用。通过实例解析了各种操作方式,有助于深化对二维数组和指针交互的理解。
915

被折叠的 条评论
为什么被折叠?



