指针函数 和 函数指针
指针函数 和 函数指针
指针函数(Function Returning a Pointer)===> 返回一个指针
指针函数是返回指针的函数。也就是说,这种函数的返回类型是一个指针。
定义和使用
- 指针函数的返回类型是一个指针类型
- 通过函数调用,返回一个指针
Demo
#include <iostream>
using namespace std;
// 一个返回int指针的函数
int* getMax(int* a, int* b) {
if (*a > *b)
return a;
else
return b;
}
int main() {
int x = 5, y = 10;
int* max = getMax(&x, &y);
cout << "Max value: " << *max << endl; // 输出 Max value: 10
return 0;
}
关键点:
- int* getMax(int* a, int* b) 是一个指针函数,它返回一个指向 int 类型的指针。
- getMax(&x, &y) 返回 x 或 y 的地址。
函数指针 (Pointer to Function)===> 是一个变量
函数指针是指向函数的指针。你可以通过函数指针来调用一个函数,就像通过指针访问变量一样。
定义和使用
- 函数指针的定义包括函数的返回类型、参数列表和指针名。
# 1. 返回类型 int
# 2. 指针变量名 func_ptr
# 3. (int, int):参数列表
int (*func_ptr)(int, int) = add;
- 它存储的是函数的地址,可以用来调用函数。
Demo【简易计算器】
#include <iostream>
using namespace std;
// 一个普通函数
int add(int a, int b) {
return a + b;
}
int main() {
// 定义一个指向返回类型为int,参数为两个int的函数指针
int (*func_ptr)(int, int) = add;
// 使用函数指针调用函数
int result = func_ptr(5, 10);
cout << "Result: " << result << endl; // 输出 Result: 15
return 0;
}
简易计算器
#include <iostream>
using namespace std;
int add(int a, int b){
return a + b;
}
int sub(int a, int b){
return a - b;
}
int multi(int a, int b){
return a * b;
}
int divide(int a, int b){
return a / b;
}
int mod(int a, int b){
return a % b;
}
int main()
{
int a, b;
char op;
int res = 0;
printf("请输入表达式>");
scanf("%d %c %d", &a, &op, &b);
switch(op){
case '+':
res = add(a, b);
break;
case '-':
res = sub(a, b);
break;
case '*':
res = multi(a, b);
break;
case '/':
res = divide(a, b);
break;
case '%':
res = mod(a, b);
break;
default:
printf("你是不是傻,计算器只支持加减乘除取余~");
break;
}
printf("计算结果为:%d\n", res);
return 0;
}
使用函数指针来优化
#include <iostream>
using namespace std;
void foo()
{
printf("foo\n");
}
double* fun1(){
static double pi = 3.1415;
return π
}
int add(int a, int b){
return a + b;
}
int sub(int a, int b){
return a - b;
}
int multi(int a, int b){
return a * b;
}
int divide(int a, int b){
return a / b;
}
int mod(int a, int b){
return a % b;
}
int main()
{
int a, b;
char op;
int res = 0;
printf("请输入表达式>");
scanf("%d %c %d", &a, &op, &b);
int (*funcPtr) (int, int) = NULL; // 操作函数指针,指向具体的运算函数
switch(op){
case '+':
funcPtr = add;
res = add(a, b);
break;
case '-':
funcPtr = sub;
break;
case '*':
funcPtr = multi;
break;
case '/':
funcPtr = divide;
break;
case '%':
funcPtr = mod;
break;
default:
printf("你是不是傻,计算器只支持加减乘除取余~");
break;
}
printf("计算结果为:%d\n", funcPtr(a, b));
return 0;
}
指针函数 VS 函数指针
指针函数 是一种函数,它返回一个指针。
函数指针 是一种变量,可以存储函数的地址,并通过它调用函数。
函数指针的应用【回调函数】
无参
#include <iostream>
void print1to100()
{
for (int i = 1; i < 100; i++)
{
if (i % 10 == 0)
{
printf("\n");
}
printf("%3d ", i);
}
}
int main()
{
print1to100();
return 0;
}
下面使用中间函数(参数为函数指针:形参为函数)
#include <iostream>
// 回调函数 1
void print1to100()
{
for (int i = 1; i < 100; i++)
{
if (i % 10 == 0)
{
printf("\n");
}
printf("%3d ", i);
}
}
// 回调函数 2
void showYourName()
{
printf("Kobe");
}
// 中间函数 ===> 库里面给的接口,实际应用的时候,我们要自己去写回调函数
void dowork(void (*callback)())
{
callback();
}
int main()
{
dowork(print1to100);
dowork(showYourName);
return 0;
}
有参
#include <iostream>
// 回调函数 1
int _plus(int a, int b)
{
return a + b;
}
// 回调函数 2
int sub(int a, int b)
{
return a - b;
}
// 中间函数
int dowork2(int (*callback)(int, int), int a, int b)
{
return callback(a, b);
}
int main()
{
printf("%d", dowork2(_plus, 2, 3));
printf("%d", dowork2(sub, 2, 3));
return 0;
}