指针函数 和 函数指针

指针函数 和 函数指针

指针函数(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 &pi;
}

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;
}
posted @ 2024-08-26 00:53  爱新觉罗LQ  阅读(60)  评论(0编辑  收藏  举报