例题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;
}