C语言--指针--多维数组与指针

例题10-10 输出二维数组有关的值

//例题10-10 输出二维数组有关的值 
#include<stdio.h> 
#define FORMAT "%d %d \n"
int main()
{
	int a[3][4]={1,2,5,7,9,11,13,15,17,19,21,23};
	printf(FORMAT,a,*a);//0行首地址,0行0列元素地址
	printf(FORMAT,a[0],*(a+0));//0行0列元素地址
	printf(FORMAT,&a[0],&a[0][0]);//0行首地址,0行0列元素地址
	printf(FORMAT,a[1],a+1);//1行0列元素地址,1行首地址
	printf(FORMAT,&a[1][0],*(a+1)+0);//1行0列元素地址
	printf(FORMAT,a[2],*(a+2)); //2行0列元素地址
	printf(FORMAT,&a[2],a+2);//2行首地址
	printf(FORMAT,a[1][0],*(*(a+1)+0));//1行0列元素的值!!
	printf(FORMAT,*(*(a+1)),**(a+1));//1行0列元素的值!!
	return 0; 
 } 

运行结果:
在这里插入图片描述

note:每次编译分配的地址是不同的

a:指向一维数组(即指向行)的指针,
*a: 指向列元素的指针,即指向0行0列元素
**a: 0行0列元素的值。

例题10-11 用指针变量输出二维数组元素的值

//例题10-11 用指针变量输出二维数组元素的值
#include<stdio.h>
int main()
{
	int a[3][4]={1,2,5,7,9,11,13,15,17,19,21,23};
	int *p;
	for(p=a[0];p<a[0]+12;p++) //p可指向整型的数组元素 
	{
		if((p-a[0])%4==0)
			printf("\n");
//		printf("%4d",*p);
		printf("addr=%o value=%2d\n",p,*p); //八进制:%o 
    }
   return 0;
} 

运行结果:
在这里插入图片描述

例题10-12 输出二维数组任一行任一列元素的值

//例题10-12 输出二维数组任一行任一列元素的值
#include<stdio.h>
int main()
{
	int a[3][4]={1,2,5,7,9,11,13,15,17,19,21,23};
	int (*p)[4],i,j;
	p=a;
	scanf("i=%d,j=%d",&i,&j);
	printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j));
	return 0;
 } 

输入:i=2,j=3
输出:a[2,3]=23

如图:
在这里插入图片描述

例题10-13 有一个班,3个学生,各学4门课,计算总平均分数及第n个学生的成绩—用指向数组的指针作函数参数

//例题10-13 有一个班,3个学生,各学4门课,计算总平均分数及第n个学生的成绩
//仅为说明用指向数组的指针作函数参数而举例
#include<stdio.h>
void average(float *p,int n)
{
	float *p_end,sum=0,aver;
	p_end=p+n-1; // p_end : 最后一个元素的 "地址" 
	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 scoref of No.%d are:\n",n);
	for(i=0;i<4;i++)
		printf("%5.2f ",*(*(p+n)+i));// *(p+n)+i == score[n][i]的地址; 
}                                   // *(*(p+n)+i) == score[n][i]的值 

int main()
{
	float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
	average(*score,12);  //指向数组的指针作函数参数
	search(score,2);
	return 0; 
 } 
// *score == socre[0] == &score[0][0] == score[0][0]的地址 
//然后使p先后指向二维数组的各个元素,p每加1就改为指向score数组的下一个元素 
Note:
*score == socre[0] == &score[0][0] == score[0][0]的地址 ;
*(p+n)+i == score[n][i]的地址;
*(*(p+n)+i) == score[n][i]的值

运行结果:
在这里插入图片描述

例题10-14 在上题基础上,查找有一门以上课程不及格的学生,输出他们的全部课程的成绩

//例题10-14 在上题基础上,查找有一门以上课程不及格的学生,输出他们的全部课程的成绩 
#include<stdio.h> 

void search(float (*p)[4],int n)
{
	int i,j,flag;
	for(j=0;j<n;j++)
	{
		flag=0;
		for(i=0;i<4;i++)
		{
			if(*(*(p+j)+i)<60)
				flag=1;
		}
		if(flag==1)
		{
			printf("No.%d fails,his scores are:\n",j+1);
			for(i=0;i<4;i++)
				printf("%5.1f",*(*(p+j)+i));
			printf("\n");
		}
	}
}

int main()
{
	float score[3][4]={{65,57,70,60},{58,87,90,81},{90,99,100,98}};
	search(score,3);
	return 0; 
} 

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值