1. 程式人生 > >C++函式指標、指標函式、返回值為函式指標的函式淺談

C++函式指標、指標函式、返回值為函式指標的函式淺談

C++函式指標、指標函式、返回值為函式指標的函式淺談

引言

函式指標、指標函式是C中重要而容易混淆的概念,博主將通過兩個例項來說明這兩個截然不同的概念。
而返回值為函式指標的指標函式就更難理解了,放在文章的最後來介紹。

函式指標

函式指標是一種特殊的 指標,它指向函式的入口。
例如int (*add)(int, int);定義了一個函式指標add,用於指向返回值為int,並且有兩個int引數的函式,下面用例項來說明

/**
 * 作者:lyn
 * 時間:2018.10.30
 * 此程式用來演示函式指標
 */
#include<iostream>
using namespace std;

int addfunc(int a, int b) {
        return a + b;
}
int main() {
        int (*add)(int, int) = addfunc;
        //兩種方法都可以
        //int (*add)(int, int) = &addfunc;

        int result = (*add)(1, 2);
        //兩種方法都可以,建議使用第一種
        //int result = add(1, 2);
        cout << "通過函式指標呼叫函式進行計算結果:" << result << endl;
        result = addfunc(1, 2);
        cout << "通過直接呼叫函式進行計算結果:" << result << endl;
        return 0;
}

在這裡插入圖片描述

指標函式

指標函式是一種返回值為指標的 函式
例如A *createA();聲明瞭一個返回值為指向A型別的指標的,引數列表為空的函式(這句話讀起來可能有一··繞口),例項說明

/**
 * 作者:lyn
 * 時間:2018.10.30
 * 該程式用來演示指標函式
 */
#include<iostream>
using namespace std;
class A {
        public:
                A(int a) {
                        this->a = a;
                }
                int getA(){
                        return a;
                }
        private:
                int a;
};

//返回值為指向型別A的指標的函式
A *createA() {
        return new A(1);
}

int main(){
        //建立一個指向A型別的指標,並呼叫createA建立一個A型別的物件
        A* b = createA();
        //通過指標呼叫類的方法
        cout << "b->a = " << b->getA() << endl;
        return 0;
}

在這裡插入圖片描述

返回值為函式指標的函式

其實在搞懂了函式指標和指標函式後,這個概念並不難懂,其實這就是一個複雜一點的指標函式,因為他的返回值為函式指標。
先給一個例子:

/*
*本例是SGISTL原始碼中的一個函式,比普通的返回值為函式指標的函式要更復雜一點
*因為本例中函式的引數也是一個函式指標
*/
void (* set_malloc_handler(void (*f)()))()

我們把例子從裡往外看
void (*f)()是一個函式指標,它用於指向一個返回值為void,無引數列表的函式
* set_malloc_handler(void (*f)())這是一個指標函式,返回值為指標,它有一個引數,引數為一個函式指標(返回值為void,無引數列表的函式)
void (* set_malloc_handler(void (*f)()))()

這是一個指標函式,返回值為函式指標(返回值為void,無引數列表的一個函式),它有一個引數,引數為一個函式指標