指標函式 和 函式指標

爱新觉罗LQ發表於2024-08-26

指標函式 和 函式指標

指標函式(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 函式指標

指標函式 是一種函式,它返回一個指標。
函式指標 是一種變數,可以儲存函式的地址,並透過它呼叫函式。

相關文章