知識ポイント10:ポインタと関数

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

おすすめ

転載: blog.csdn.net/Shao_yihao/article/details/113275563