指针函数与函数指针

这篇博客详细介绍了C语言中指针作为函数参数的用法,包括一维和二维数组的平均值计算。此外,还讲解了函数指针的概念,如何将函数作为参数传递给其他函数,以及回调函数的应用。示例代码展示了如何使用函数指针实现最大值和最小值的计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.指针变量做函数形参

指针数组的分类

 

一维数组

#include <stdio.h>
float get_avg(float *b,int n);
/*
一维数组 
实参是数组名,形参是指针变量
求数组的平均值 
*/

int main()
{
	float a[5]={10,21,12,13,14};
	float avg=0;
	
	avg=get_avg(a,5);   //实参是数组名a,普通变量数组大小 
	printf("数组a的平均值为:%.f",avg);
	return 0;
 } 
 
float get_avg(float *b,int n)   //指针变量b,指向数组a的首地址 
{
	float avg=0;
	int i;
// 	int i;
     //方法二,指针变量保持不变,使用普通变量或数组更改相对值 
	for(i=0;i<n;i++) 
	{
		printf("%.1f ",*(b+i));  //等价于b[i]
		//printf("log:%.f ",*b+i);   //错误方式:先取*p指向内容,然后对其内容进行增加i 
	} 

//	for(i=0;i<n;i++)
//	{
//		avg +=*b; 
//		b++;         //avg是所有元素累加的和,指针变量b的每次循环,往后移动一次 
//	}
	 //方法二,指针变量保持不变,使用普通变量或数组更改相对值
	for(i=0;i<n;i++)
	{
		avg +=*(b+i); 	 //avg是所有元素累加的和,指针变量b的每次循环,往后移动一次,等价于b[i] 
	}
	avg /= n;
	return avg; 
 }

二维数组

#include <stdio.h>
float get_avg(float (*b)[3],int col,int row);
/*
二维数组 
实参是数组名,形参是指针变量
求数组的平均值 
*/
int main()
{
	float a[3][3]={{10,11,12},{20,21,22},{30,31,32}};
	
	float avg=0;
	avg=get_avg(a,3,3);
	printf("平均值为:%f",avg);
		
	return 0;
 } 
 
 //float get_avg(float b[][3],int col,int row)
 float get_avg(float (*b)[3],int col,int row)
 {
 	float avg=0;
	 int i,j; 
// 	printf("log:%.f\n",*(*b));       //第0行0列元素 
// 	printf("log:%.f",*(*(b+1)+1));  //第一行一列的元素 

// 	for(i=0;i<col;i++)
// 	{
// 		for(j=0;j<row;j++)
// 		{
// 			avg += *(*(b)+j);
//		}
//		b++;     //b增加1,直接加一行 
//	}
	for(i=0;i<col;i++)
 	{
 		for(j=0;j<row;j++)
 		{
 			avg += *(*(b+i)+j);		//等价于b[i][j] 
		}

	}
	printf("log: %.f\n",avg);
	printf("log:%.f\n",*(*(b+0)+1));	//打印0行1列
	avg /= col*row;
	 
 	return avg;
}

2.函数指针

         函数指针最常用的地方在于将一个函数作为参数传递给另一个函数的时候要用函数指针。

         将一个函数作为参数传递给另外一个函数,将这个函数称为回调函数。

#include <stdio.h>
int max(int i,int j);
int min(int i,int j);
int process(int (*fun)(int i,int j),int i,int j);
//函数指针----指针保存函数的地址

int main()
{
	int a=100,b=200;
	int c=0;
//	int (*fun)(int i,int j);	//函数指针变量的定义, 定义是需要参考函数声明 
//	fun=max;					//初始化,函数指针变量 指向对应函数 
//	c=fun(a,b);
//	c=(*fun)(a,b);		//等价于 c=fun(a,b);a
//	printf("max c=%d\n",c);
//	fun=min;
//	c=min(a,b);
//	printf("min c=%d\n",c);
	
	c=process(max,a,b);		//process()被调函数,max()回调函数 
	printf("max c=%d\n",c);
	
	c=process(min,a,b);		//process()被调函数,min()回调函数 
	printf("min c=%d\n",c);
	return 0;
} 

int process(int (*fun)(int i,int j),int i,int j)
{
	int ret;
	ret = fun(i,j);
	return ret;
}
int max(int i,int j)		//函数名实际就是函数的首地址,或称为入口地址 
{
	if(i>j)
		return i;
	else
		return j;
}

int min(int i,int j)
{
	if(i<j)
		return i;
	else
		return j;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值