C++学习笔记35:指针作函数参数、指针型函数和指向函数的指针

用指针作函数参数

作用

  1. 使实参与形参指针指向共同的内存空间,达到双向传递的目的。(引用也可达到同样的效果)
  2. 减少函数调用时数据的开销
  3. 通过指向函数的指针传递函数代码首地址。

例:输入三个浮点数,分离出整数部分和小数部分。

#include<iostream>
using namespace std;
void splitfloat(float x, int* intpart, float* floatpart)
{
	*intpart = int(x);
	*floatpart = x - *intpart;
}


int main()
{
	for (int i = 0; i < 3; i++)
	{
		float x, f;
		int n;
		cin >> x;
		splitfloat(x, &n, &f);
		cout << n << " " << f << endl;
	}

	return 0;
}

使用指针作为形参将整数变量和小数变量的地址传给指针,在函数内部对两个地址的内容进行修改后,主函数中的变量的值就被修改了。
如果函数体不需要通过指针改变指针所指向的内容的值时,在参数表中将它声明为指向常量的指针。

指针型函数

函数的返回值是指针,这个函数就是指针类型的函数
语法形式

存储类型 数据类型 *函数名()
{//函数体语句
}

数据类型表示函数返回指针的类型;函数名和*标识了一个指针型函数;参数表中是函数的形参列表。
注:

  1. 不要将非静态局部地址作为函数的返回值。
  2. 返回的指针要确保在主调函数中是合法有效的地址。

例 正确使用

  1. 主函数中定义的数组,在子函数中进行某种操作后,返回一个元素的地址,就是合法地址。
  2. 在子函数通过动态内存分配new取得的内存地址返回给主函数是合法有效的,但内存分配和释放不在同一级别,要注意不能忘记释放,避免内存泄露。

指向函数的指针

函数指针指向的是程序代码储存区
声明一个函数指针时,也需要说明函数的返回值、形参列表。

数据类型 (* 函数指针名) (形参表)

函数指针在使用前一定要进行赋值,使指针指向一个已经存在代码的起始地址。函数指针名=函数名等号右边的函数名必须是一个已经声明过的、和函数指针具有相同返回类型和相同参数表的函数。
作用:实现函数回调
相当于一个大的容器里面包含了多种函数,想用什么函数,就取对应函数的首地址去调用它实现功能。
例:编写一个计算函数compute,对两个整数进行各种计算。有一个形参为指向具体算
法函数的指针,根据不同的实参函数,用不同的算法进行计算
编写三个函数:求两个整数的最大值、最小值、和。分别用这三个函数作为实参,测
试compute函数

#include <iostream>
using namespace std;
int compute(int a, int b, int(*func)(int, int))
{ return func(a, b);}
int max(int a, int b) // 求最大值
{ return ((a > b) ? a: b);}
int min(int a, int b) // 求最小值
{ return ((a < b) ? a: b);}
int sum(int a, int b) // 求和
{ return a + b;}
int main()
{
int a, b, res;
cout << "请输入整数a:"; cin >> a;
cout << "请输入整数b:"; cin >> b;
res = compute(a, b, & max);
cout << "Max of " << a << " and " << b << " is " << res << endl;
res = compute(a, b, & min);
cout << "Min of " << a << " and " << b << " is " << res << endl;
res = compute(a, b, & sum);
cout << "Sum of " << a << " and " << b << " is " << res << endl;
}

主函数中将max函数的地址传递后进入compute函数,再调用到具体的max函数。使得在处理类似事件时可以灵活调用不同的方法。而且调用者不关心谁是被调用者compute,需要知道存在一个特定原型和限制条件的被调用函数max。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值