1.ポインタを返す関数
戻りポインタを定義する関数は、戻り値がポインタであることを示すために関数名の前に*が追加されていることを除いて、基本的に通常の関数と同じです。
#include <stdio.h>
float *search(float (*pointer)[4])//定义了一个返回地址的函数
{
int i = 0;
float *pt;
pt = NULL;//初始化指针为空指针
for(; i < 4; i ++)
if (*(*pointer+i) < 60)
pt = *pointer;//若该行中存在不及格的分数,则将该行的地址赋给pt,再返回给主函数
return(pt);
}
int main()
{
float score[][4] = {
60, 70, 80, 90, 56, 89, 67, 88, 34, 78, 90, 66};
float* p;
int i, j;
for (i = 0; i < 3; i ++)//对矩阵的每一行进行检查
{
p = search(score + i);//将每一行(一维数组)的地址传给函数
if (p != NULL)//返回值不是空指针,说明该行中存在不及格分数,输出所有科目的成绩
{
for (j = 0; j < 4; j ++)
printf("%5.2f\t", *(p + j));
printf("\n");
}
}
return 0;
}
2.関数パラメーターとしてのポインター
#include <stdio.h>
void average(float *p, int n)//指针变量作形参,即传递给函数一个指针(地址)
{
float sum = 0, aver;
float *p_end = p + n - 1;//为表示循环结束,引入一个定值以指向最后一个元素,避免p值改变带来的影响
for (; p <= p_end; p ++)
sum = sum + (*p);
aver = sum / n;
printf("%5.2f\n", aver);
}
void search(float (*p)[4], int n)//传递给函数一个指向一维数组的指针
{
int i;
for (i = 0; i < 4; i ++)
printf("%5.2f ", *(*(p+n)+i));
}
int main()
{
float score[3][4] = {
65, 67, 70, 60, 80, 87, 90, 81, 90, 99, 100, 98};
average(*score, 12);//*score表示score[0][0]的地址,在接下来的p++操作时为每行的列元素的操作(即到了单个数组元素水平)
search(score, 2);//score表示score[0](一维数组)的地址,则p++操作是一位数组水平,行数+1或-1
return 0;
}
#include<stdio.h>
void search(float (*p)[4], int n)
{
int i;
for (i = 0; i < 4; i ++)printf("%5.2f ", *(*(p+n)+i));
putchar('\n');
}
int main()
{
float score[3][4] = {
65, 57, 70, 60, 58, 87, 90, 81, 90, 99, 100, 98};
int i, j;
for (i = 0; i < 3; i ++)
for (j = 0; j < 4; j ++)
{
if (score[i][j] < 60)//若该学生有一门成绩不及格,就输出他的所有科目的成绩
{
search(score, i);
break;
}
}
return 0;
}