Sunday, October 11, 2020

函式指標的使用,以及使用函式指標的好處

函式指標是指向函式的指標變數。

程式在編譯時,每一個函式都有一個入口地址,該入口地址就是函式指標所指向的地址。

1. 函式指標的宣告

bool (*pf)(int, int);

//pf指向一個函式,該函式的引數是兩個int,返回值是 bool 型別

2. 函式指標的初始化

//例如有這樣一個函式:bool cmp(int a, int b);

pf = cmp//注意 cmp 型態返回值應與宣告的的函式指標的型別匹配

3. 呼叫函式指標

bool b = pf(3,5);

等價於直接呼叫:bool b = cmp(3,5);

函式指標有兩個方面的應用:

1. 把指標函式當作形參傳遞給某些具有一定通用功能的模組。並封裝成介面來提高程式碼的靈活性和後期維護的便捷性

example:

void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

1. 待排序陣列首地址
2. 陣列中待排序元素數量
3. 各元素的佔用空間大小
4.  指向函式的指標,用於確定排序的規則 (可提供不同的排序法)

歸納為:便於分層設計、利於系統抽象、降低耦合度以及使介面與實現分開。

這裡通過比較一個比較 low 的氣泡排序來說明一下 qsort 內部函式指標的實現機制:

#include<iostream>
using namespace std;
void sort(int arr[], int size, bool(*cmp)(int,int));
bool up(int a, int b);
bool down(int a, int b);
int main()
{
    int arr[10];
    for (int i = 0;i < 10;++i)
        cin >> arr[i];

    sort(arr, 10,down);

    for (int i = 0;i < 10;++i)
        cout << arr[i] << " ";
    return 0;
}
void sort(int arr[],int size,bool(*cmp)(int,int))//簡單氣泡排序
{
    int temp;
    for (int i = 0;i < size-1; ++i)
    {
        for (int j = i;j < size-1;++j)
        {
            if (cmp(arr[i], arr[j + 1]))
            {
                temp = arr[i];
                arr[i] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}
bool up(int a, int b)
{
    if (a > b)
        return 1;
    else
        return 0;
}
bool down(int a, int b)
{
    if (a > b)
        return 0;
    else
        return 1;
}
2. 有些地方必須使用函式函式指標才能完成給定的任務,如linux系統中的非同步訊號中斷處理,當發生某一觸發訊號時,需要呼叫相應的處理函式,此時需要使用函式指標來實現。

void (*signal(int signum,void(* handler)(int)))(int); 

引數一為訊號條件,第二個引數為一個函式指標,它所指向的函式需要一個整型引數,無返回值。
該函式的返回值也是一個函式指標,返回的指標所指向的函式有一個整型引數(一般不用)

No comments:

Post a Comment

n8n index

 【n8n免費本地端部署】Windows版|程式安裝x指令大補帖  【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能