【C語言】指針與二維數組筆記總結(三)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章