浅谈指针与函数

指针与函数

在函数以外的区域内,一般无法修改函数的实参值,但是通过指针变可以间接的改变。
如:

#include <stdio.h>
void swap(int *x,int *y);
void swap(int *x,int *y)
{	
	int temp;
	printf("In swap,交换前:x = %d,y = %d",*x, *y);
	temp = *x;
	*x = *y;
	*y = temp;
	printf("In swap,交换后:x = %d,y = %d",*x, *y);
}
	int main(void)
	{
		int x = 3, y = 4;
		printf("In main,交换前:x = %d,y = %d",*x, *y);
		swap(&x,&y);
		printf("In main,交换前:x = %d,y = %d",*x, *y);
		return 0;
	}

In main,交换前:x = 3,y = 4
In swap,交换前:x = 3,y = 4
In swap,交换后:x = 4,y = 3
In main,交换后:x = 4,y = 3

#指针函数
类比之前的指针数组和数组指针,可知指针函数是函数返回值为指针。
需要注意的是不能把局部变量的指针(即函数内部的指针)作为函数的返回值。
列如:

#include <stdio.h>
char *getword(char c);
char *getword(char c)
{
	switch(c)
	{
		char str[]={app};//在这里变是把局部变量作为函数的返回值。
		case a: return str;
		default :return end;
	}
}
int main(void)
{
	char a;
	printf("请输入一个字母:");
	scanf("%c",&a);
	printf("%s\n",getword(a));
}

#函数指针
函数指针就是一个指向函数的指针。
##函数指针作为参数

#include <stdio.h>
int add(int, int);
int sub(int, int);
int calc(int(*pa)(int, int), int, int);
int add(int x, int y)
{
	return x + y;
}
int sub(int x, int y)
{
	return x - y;
}
int calc(int(*pa)(int, int), int x, int y))//一个参数是函数,两个参数是整数。
{
	return (*pa)(x, y);
}
int main(void)
{
	int x,  y;
	printf("请输入2个数:");
	scanf("%d %d",&x,&y);
	printf("%d + %d = %d\n",x, y, calc(add)(x, y));
	printf("%d - %d = %d\n",x, y, calc(sub)(x, y));
	return 0;
}

##函数指针作为返回值
函数指针作为返回值又该怎么声明呢?
指针函数的样子是 int*a(); 我们知道这个式子的 int*是返回的类型 a是名字()则是参数。
那么同理函数指针作为返回值就是要先声明一个函数a()//a为名字()为参数,然后再写上函数指针,把它作为返回类型即可。
所以函数指针作为返回值的声明便是这样int(*a())(int, int);使用这个式子便可通过一个函数调用另外一个函数。(上面的函数指针作为参数则是在一个函数里调用另外一个函数的返回值)。
举个列子,修改上一个代码来做个简陋计算器。

#include <stdio.h>
double add(double, double);
double sub(double, double);
double mul(double, double);
double divi(double, double);
double calc(double(*fp)(double, double), double , double );
double (*select(char op))(double, double);
double add(double x, double y)
{
	return x + y;
}
double sub(double x, double y)
{
	return x - y;
}
double mul(double x, double y)
{
	return x * y;
}
double divi(double x, double y)
{	  
      return x / y;    
}
double calc(double(*fp)(double, double), double x, double y)
{
	return (*fp)(x, y);
}
double (*select(char op))(double x, double y)
{
	switch(op)
	{
		case '+': return add;
		case '-': return sub;
		case '*': return mul;
		case '/': return divi;
	}
}
int main(void)
{
	double x,  y;
	char op;
	printf("请输入一个式子如(3+4):");
	scanf("%lf%c%lf",&x,&op, &y);
	printf("%lf %c %lf = %lf \n",x, op, y, calc(select(op), x, y));
	return 0;
}

在这里插入图片描述
这样一个简陋的计算器就完成了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值