目錄
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;
}