通过代码认识-指针变量做函数形参,指针传参,指针函数,函数指针,回调函数等

       一维数组求平均值(指针变量做函数的形参)

#include <stdio.h>
//一维数组 
//实参是数组名,形参是指针变量
//求数组的平均值 
float get_avg(float *b, int n);
int main()
{
	float arr[5]={4,8,6,7,1};
	float avg=0;
	avg=get_avg(arr,5);//实参是数组名a,和普通变量数组的大小 
	printf("数组arr的平均值为: %.1f\n",avg);
	return 0;
 } 
 
 float get_avg(float *b, int n)//指针变量b,指向数组arr的首地址。
 {
 	float avg=0;//需要返回值 
 	int i;
 	for(i=0;i<n;i++,b++)
 	{
 		avg+=*b;//元素和 ,指针变量b每循环一次 ,往后移动一次 
	}
	avg=avg/n;
	return avg; 

        二维数组求平均值(指针变量做函数的形参)

        有了元素的指针,就可以用指针法表示二维元素的数组 , *(*(b+i)+j)   等价于  b[ i ][ j ]  等价于 *(a [ i ] + j ): 指针加1是移动一行,b + i表示第 i 行的指针,也就是第 i 行的首地址;

        区别 : p + i 是第 i 行的地址,*(p + i)是第 i 行元素的地址,也可以理解成第 i 行元素的列地址,所以 *(*(p+i)+j) 则是第 i 行第 j 列元素的值,例如: *(*(p+0)+2) 表示第0行第2列元素的值。

//二维数组 
//实参是数组名,形参是指针变量
//求数组的平均值 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int get_avg(int (*b)[5],int hang, int lie);
int main()

{
	int arr[5][5]={0};
	int i,j;
	int avg=0;
	int max=0;
	srand((unsigned)time(NULL));
	for(i=0;i<5;i++)
	{
		for(j=0;j<5;j++)
		{
			arr[i][j]=rand()%50+10;
			printf("%d ",arr[i][j]);
		}
		printf("\n");
	}
	avg=get_avg(arr,5,5);//实参是数组名arr,和普通变量数组的大小 
	printf("数组arr的平均值为:%d",avg)	;
	return 0;
}

int get_avg(int (*b)[5],int hang, int lie)//指针变量b,指向数组arr的首地址。
{
	int i,j;
	int avg=0;
	for(i=0;i<hang;i++)
	{
		for(j=0;j<lie;j++)
		{
			avg +=*(*(b+i)+j);//等价于b[i][j] 		
		}	
	}
	avg=avg/25;
}

        指针函数:指针作为函数的返回值

        

        函数指针

         回调函数(函数也可以作为函数的参数来传递)

#include <stdio.h>
//函数指针:指针保存函数的地址 

int max(int x,int y) ; 
int min(int x,int y) ; 

int main()
{
	int a=100,b=300;
	int m=0;
	m=process(max,a,b);//process()被调函数,max()回调函数 
	printf("max m=%d\n",m);
	m=process(min,a,b);//process()被调函数,max()回调函数 
	printf("min m=%d\n",m);
}
//回调函数 
int process(int (*fun)(int x, int y),int x, int y)//函数指针作为参数的形参 
{
	int ret;
	ret=fun(x,y);
	return ret;	
 } 

int max(int x,int y) 
{
	if(x>y)
		return x;
	else 
		return y;
}

int min(int x,int y) 
{
	if(x<y)
		return x;
	else 
		return y;
}

        作业中的应用

        1.编写一个函数fun,函数的功能是分别求出数组中所有奇数之和,以及所有偶数之和,形参N给了数组中数据的个数;利用指针变量odd返回奇数之和,利用指针变量even返回偶数之和;

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int fun(int *arr, int n, int *odd, int *even);
int main()
{
	int a[10]={0};
	int oddsum=0;int evensum=0;
	int *odd=&oddsum;//取地址 
	int *even=&evensum;
	fun(a,10,odd,even);
	printf("奇数之和为%d \n",*odd);
	printf("奇数之和为%d \n",*even);
	return 0;	
}

int fun(int *arr, int n, int *odd, int *even)
{
	int i;
	srand((signed)time(NULL));
	for(i=0;i<10;i++)
	{
		arr[i]=rand()%20+1;
		printf("%d ",arr[i]);	
	}	
	printf("\n"); 

	for(i=0;i<10;i++)
	{
		if(arr[i]%2!=0)
			*odd+=*(arr+i);//arr[i]
	}

	for(i=0;i<10;i++)
	{
		if(arr[i]%2==0)
			*even+=*(arr+i);//arr[i]
	}
}

结果为:

         2.写一个程序,声明一个3*5的数组并初始化,具体数值可随意,程序打印出数值,然后数值翻一番,接着再次打印出新值,编写-一个函数来显示数组内容,在编写另一个函数执行翻倍功能,数组名和数组行数作为参数由程序传递给函数.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int input(int a[3][5],int i,int j);
int fun(int (*b)[5],int i,int j);
int main()
{
	int a[3][5]={0};
	input(a,3,5);
	fun(a,3,5) ;
	return 0;
}

int input(int a[3][5],int i,int j) 
{
	srand((unsigned)time(NULL));
	for(i=0;i<3;i++)
	{
		for(j=0;j<5;j++)
		{
			a[i][j]=rand()%20+1;
			printf("%d\t",a[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

int fun(int (*b)[5],int i,int j) 
{
	for(i=0;i<3;i++)
	{
		for(j=0;j<5;j++)
		{
			b[i][j]=(b[i][j])*2;
			printf("%d\t",b[i][j]);
		}
		printf("\n");
	}
}

结果为:

         3.计算器程序修改,主调函数使用函数名做为实参,被调函数形参使用函数指针类型。

#include <stdio.h>
//函数指针计算 
int plus(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int div(int x, int y);
int process(int(*fun)(int x, int y),int x, int y);
int main()

{
	int a,b,c;char ch,ch1;//ch1为=号 
	printf("请输入两个整数,该功能可以实现您想要的运算\n");//a + b =这种形式 
	scanf("%d",&a);
	scanf("%c",&ch);
	scanf("%d",&b);
	scanf("%c",&ch1);//输入=号 
	switch(ch)
	{
		case '+' :
			c=process(plus,a,b);
			printf("%d\n",c);
			break;
		case '-' :
			c=process(sub,a,b);
			printf("%d\n",c);
			break;
		case '*' :
			c=process(mul,a,b);
			printf("%d\n",c);
			break;
		case '/' :
			c=process(div,a,b);
			printf("%d\n",c);
			break;
		default:
			break;	
	}
	return 0;
}

int process(int (*fun)(int x, int y),int x, int y)
{
	int ret;
	ret=fun(x,y);
	return ret;
}

int plus(int x, int y)
{
	return x+y;	
}

int sub(int x, int y)
{
	return x-y;		
}

int mul(int x, int y)
{
	return x*y;	
}

int div(int x, int y)
{
	if (y!=0)
	{
		return x/y;
	}
	else
	{
		printf("除数不能为0\n");
		return 0;
	}
}

结果为:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值