#include<stdio.h>
float *search(float (*pointer)[4],int n)//pointer是一个*类型的指针,指向一个含有四个元素的数组,指向某一排
{
float *pt;
pt=*(pointer+n);//这里的pt就指向了某排数组的莫一列,某个具体的元素 ,给pointer
//加n就是指向第n排,再取pointer的地址就得到了某一排起始元素的地址
return pt;//返回pt的地址
}
int main(void)
{
float score[][4]={{6,7,8,9},{1,2,3,4},{5,6,7,8}};
float *p;
int i,k;
scanf("%d",&k);
printf("%d",k);
printf("The score of No.%d are :\n",k);
p=search(score,k);
for(int i=0;i<4;i++)
{
printf("%5.2f",*(p+i));//直接用指针法引用数组
printf("\n");
}
}
由此可见可以直接对一个指向多维数组的排的一级指针进行加减,从而达成换行的操作,用与该指针进行操作可以得到该排的首元素的地址,一级指针放着某排的地址,其实也是指向改排的首元素,但是不可以混用不同级数不同的指针,pointer+n换排,(pointer)+n,对某排进行列的操作(但是仍是地址,若要打印值,则还需要再次使用取值符)。
现在给出一个很直观的例子:
#include<stdio.h>
int main(void)
{
float score[][4]={{60,70,80,90},{56,89,67,68},{34,78,90,66}};
float *search(float (*pointer)[4]);//也是定义一个指向含有4个元素的数组的指针
float *p;
int i,j;
for(int i=0;i<3;i++)
{
p=search(score+i);//迭代更换排进行遍历,p会在search函数里面被赋search函数返回的pt指针的地址
if(p == *(score+i))//如果pt的地址被改为了改排的首元素的地址,则这一排就有不及格的情况存在,
//就是看pt是否指向该排的首元素的地址
{
printf("No.%d score :",i);
for(j=0;j<4;j++)
{
printf("%5.2f",*(p+j));
}
printf("\n");
}
}
return 0;
}
float *search(float (*pointer)[4])
{
int i=0;
float *pt;
pt=NULL;//先把pt指向空指针,既pt=0
for(;i<4;i++)
{
if(*(*pointer+i)<60)
pt=*pointer;//如果存在不及格的科目,就把pt的指向换为该排的首元素的地址
}
return pt;//返回pt的地址作为裁判的依据。
}