指针函数的不同应用

本文探讨了指针在处理数组时的不同用法,包括如何用指针接收一维和二维数组,指针数组和数组指针的区别,以及指针函数和函数指针的概念。通过实例展示了如何使用指针函数来实现简单的计算器功能、计算数组中奇偶数之和以及操作多维数组的打印和翻倍功能。
摘要由CSDN通过智能技术生成

用指针接受数组

一维数组用指针接受时,可以直接接受,但二维数组用指针接收就较为复杂,接受二维数组时定义方式为 float  (*b)[ 4 ]    (*b )代表行   [ 4]代表列  ;

*((*b)+1)  在同一行的列进行跳跃               *( *(b+1) )  在同一列的行进行跳跃

#include <stdio.h>
float get_avg(float (*b)[4], int x,int y);
int main()
{
 	float avg;
 	float *p;
 	float array[4][4]={{1,2,3,4},{11,12,13,14},\
	 				   {21,22,23,24},{31,32,33,34}};
	//p=array;
	//p=&array;       //跟另两种不一样
	//p=&array[0];	  三种初始化			   
	printf("%.1f\n", *p);	   
	 				   
 	avg=get_avg(array,4,4); 
 	printf("%.1f\n", avg++);
 printf("%.1f", avg);
	return 0; 
} 
float get_avg(float (*b)[4], int x,int y)
{
	float avg;
	int i,j;
	//printf("%.f\n", *(*b+1) ); //b先取内容再给内容加1 
	//printf("%.f\n", *(*(b+1))  );//b先加1再取b+1的内容 
	for(i=0;i<x;i++)
		for(j=0;j<y;j++)
			avg+=*(*(b+i)+j);			
	return avg/16;
}

 指针数组 :是一个数组,元素由指针构成                  int *a[10]         []比*优先级高,先结合

 数组指针 :是一个指针,指向数组的指针                  int (*p) [10]         先结合(*p)

 指针函数 :是一个函数,可以返回指针的函数

                     定义方式        int    *fun( int x, int y)

#include <stdio.h>
int *fun(int array[]);
int main()
{	
	int array[3]={8,5,7};
	int *pum=NULL;
	pum=fun(array);            //  需要有指针接受返回的指针
	printf("%d", *pum);

	return 0; 
}
int *fun(int array[])         //需先定义为指针型函数,不然无法返回指针
{
	int *p;
	p=array;
	return p;                  //返回了指针p
}

 函数指针 :是一个指针,指向函数的指针             可以将函数作为实参传递,实现主函数调用                                                                                               函数,调用函数再接受函数进行调用

                      定义方式         int   process   (int  (*fun)(int x, int y),int x,int y)    

                                              int (*fun)(int x, int y) 是函数指针,可以接受其余函数,从而调用

例·   封装不同函数用指针函数进行调用,实现简单计算器功能

#include <stdio.h>

int jia (int x,int y);
int jian(int x,int y);
int cheng(int x,int y);
int chu(int x,int y);
int process ( int (*fun)(int x, int y),int x,int y);
int main()
{
	int x,y,cons;
	char ch;
	printf("请输入两个数字以空格隔开\n");
	scanf("%d %d", &x,&y);
	printf("请输入运算符\n");
	getchar();
	ch=getchar();
	switch(ch)
	{
		case '+':
			cons=process(jia,x,y);
			break;
		case '-':
			cons=process(jian,x,y);        //实现函数指针功能
			break;
		case '*':
			cons=process(cheng,x,y);
			break;
		case '/':
			cons=process(chu,x,y);
			break; 
		default :
			break;
	}
	printf("%d\n", cons);

	return 0;
} 

int jia (int x,int y)
{
 	int ret;
 	ret=x+y;
	return ret; 
} 
int jian(int x,int y)
{
	int ret;
	ret=x-y;
	return ret;
}
int cheng(int x,int y)
{
	int ret;
	ret=x*y;
	return ret;
}
int chu(int x,int y)
{
	int ret;
	ret=x/y;
	return ret;
}
int process (int (*fun)(int x,int y), int x,int y)
{
	int ret;
	ret=fun(x,y);
	return ret;
}

例 用指针函数返回一个数组的奇数之和,偶数之和

#include <stdio.h>
void *fun(int array[],int x,int *odd,int *even);
int main()
{
	int sum_j=0,sum_o=0;
	int *odd=&sum_j;
	int *even=&sum_o;
	int array[10]={0,1,2,3,4,5,6,7,8,9};
	fun(array,10,odd,even);
	
	printf("奇数之和%d   偶数之和%d\n", *odd,*even);
	return 0;
}

void *fun(int array[],int x,int *odd,int *even)
{
	int i;
	for(i=1;i<x;i+=2)
		*odd+=array[i];
	//printf("%d\n", *odd);
	for(i=0;i<x;i+=2)
		*even+=array[i];
	//printf("%d", *even);
}

例  定义一个三行五列数组,引用两个函数,一个函数实现打印功能,一个实现翻倍功能

#include <stdio.h>
void print(int array[3][5], int x,int y);
int main()
{
	int array[3][5]={{1,2,3,4,5}\
					,{11,12,13,14,15}\
					,{21,22,23,24,25} };
	print(array,3,5);
	multi(array,3,5);
	print(array,3,5);

	return 0;
}

void print(int array[3][5], int x,int y)
{
	int i,j;
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)
			printf("%d\t", array[i][j]);
	printf("\n");		
	}		
}

void multi(int array[3][5],int x,int y)
{
	int i,j;
	for(i=0;i<x;i++)
		for(j=0;j<y;j++)
			array[i][j]*=2;		
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值