#include <stdio.h>
#include <string.h>
#define LINE 4 /*行*/
#define COL 4 /*列*/
main()
{
float *search(float (*)[COL]);/*(float (*)[COL])中未声明具体的指针变量名,这样便于search函数定义时可以随意使用变量名*/
float score[LINE][COL]={{75,69,87,89},{99,61,50,71},{88,42,93,78},{95,96,35,74}};
float *p;
int i,j,k=0;
/*以下是输出原数组*/
printf("Source Array:/n");
for(p=*score,i=0;p<*score+LINE*COL;p++,i++)
{if(i!=0&&i%COL==0) printf("/n");/*如果不加i!=0条件,输出的结果将不是每4个元素值一行*/
printf("%-7.2f",*p);
}
putchar('/n');
for(i=0;i<LINE;i++)
{p=search(&score[i]);/*调用返回指针值的函数search,(score+i)表示数组中第i行首元素的地址(指针),(score+i)可以写成&score[i],如果写成其它同等(正确)形式,VC++系统进行编译时会发出警告,但不会影响运行结果*/
if(p==*(score+i))/*如果search函数返回的地址(指针)是数组中第i行第0列元素的地址(指针,与数组中的第i行第0列相等)就执行后面的语句*/
{if(k++==0) printf("Failed students:/n");/*使字符串“Failed students”只被打印一次*/
printf("NO.%d scores:",i);
for(j=0;j<COL;j++)
printf("%-7.2f",*(p+j));
printf("/n");
}
}
}
float *search(float (*p)[COL])
{
float *pointer;
int i;
pointer=*(p+1);
for(i=0;i<COL;i++)
if(*(*p+i)<60) pointer=*p;/*如果*(*p+i)的值小于60,则重新对指针变量pointer进行赋值,否则维护原有值不变,仍为pointer=*(p+1),即下一行的首元素地址*/
return(pointer);
}
/*注意区分*(p+i)与*p+i的使用方法和运算结果的异同*/