函數指針和指針函數的區別

一、函數指針和函數指針數組的區別

函數指針是指向函數的指針變數,而函數指針數組則是由函數指針組成的數組。

函數指針數組定義:

    
        int (*funcArr[5])(int a, int b);
    

上面的定義中,funcArr是一個長度為5的數組,每個元素都是一個指向返回類型為int,參數類型為int和int的函數的指針。

二、函數指針的使用

函數指針可以用來調用函數,也可以作為函數的返回值或者參數。

函數指針作為形參使用:

    
        int add(int a, int b);
        void callback(int (*func)(int, int));
        int main() {
            callback(add);
            return 0;
        }
        void callback(int (*func)(int, int)) {
            func(1, 2);
        }
    

上面的代碼中,在主函數中調用callback函數,並將add函數的地址作為參數傳入callback函數中。在callback函數中,函數指針func被調用,此時add函數也被調用,並返回了3。

三、函數指針和指針函數

函數指針是指向函數的指針變數,而指針函數則是返回值為指針的函數。

指針函數的定義及使用:

    
        int* getArray() {
            int* arr = (int*)malloc(sizeof(int) * 10);
            return arr;
        }
        int main() {
            int* ptr = getArray();
            return 0;
        }
    

上面的代碼中,getArray函數返回一個int類型的指針。在主函數中,使用指針變數ptr來接收getArray函數的返回值。

四、指針函數怎麼用

指針函數可以用來返回指針,也可以作為函數的參數。

指針函數作為實參使用:

    
        void print(int* arr) {
            int i;
            for (i = 0; i < 10; i++) {
                printf("%d ", arr[i]);
            }
            printf("\n");
        }
        void fill(int* (*getArray)()) {
            int i;
            int* arr = getArray();
            for (i = 0; i < 10; i++) {
                arr[i] = i;
            }
            print(arr);
        }
        int* getArray() {
            int* arr = (int*)malloc(sizeof(int) * 10);
            return arr;
        }
        int main() {
            fill(getArray);
            return 0;
        }
    

上面的代碼中,fill函數的參數是一個指向返回值為int類型指針的函數指針,即getArray函數。在fill函數內部,getArray函數被調用,並返回一個int類型的指針。fill函數利用這個指針,將其內容填充為0~9的數字,並調用print函數列印數組。

五、函數指針表

函數指針表是由函數指針構成的數組,每個函數指針指向不同的函數。我們可以通過函數指針表來實現對不同函數的動態調用。

函數指針表的定義和使用:

    
        int add(int a, int b);
        int sub(int a, int b);
        int mul(int a, int b);
        int div(int a, int b);
        int main() {
            int (*funcTable[])(int, int) = {add, sub, mul, div};
            int i;
            for (i = 0; i < 4; i++) {
                int result = funcTable[i](10, 5);
                printf("%d ", result);
            }
            return 0;
        }
        int add(int a, int b) {
            return a + b;
        }
        int sub(int a, int b) {
            return a - b;
        }
        int mul(int a, int b) {
            return a * b;
        }
        int div(int a, int b) {
            return a / b;
        }
    

上面的代碼中,funcTable是一個函數指針數組,其中的每個元素都是指向各自函數的函數指針。在主函數中,我們遍歷函數指針表,依次調用指向的函數。

六、指針函數和函數指針的區別

指針函數返回指針類型的數據,而函數指針是指向函數的指針變數。

指針函數的用法:

    
        int* getArray() {
            int* arr = (int*)malloc(sizeof(int) * 10);
            return arr;
        }
        int main() {
            int* ptr = getArray();
            return 0;
        }
    

函數指針的用法:

    
        int add(int a, int b);
        int main() {
            int (*func)(int, int) = add;
            int result = func(1, 2);
            return 0;
        }
        int add(int a, int b) {
            return a + b;
        }
    

七、指針函數和普通函數的區別

指針函數返回指針類型的數據,而普通函數則不返回指針類型數據。

指針函數的用法:

    
        int* getArray() {
            int* arr = (int*)malloc(sizeof(int) * 10);
            return arr;
        }
        int main() {
            int* ptr = getArray();
            return 0;
        }
    

普通函數的用法:

    
        int add(int a, int b);
        int main() {
            int result = add(1, 2);
            return 0;
        }
        int add(int a, int b) {
            return a + b;
        }
    

八、指針變數函數

指針變數函數是一個函數,它返回一個指針變數。

指針變數函數的用法:

    
        int* getPointer(int value) {
            int* ptr = (int*)malloc(sizeof(int));
            *ptr = value;
            return ptr;
        }
        int main() {
            int* ptr = getPointer(10);
            printf("%d ", *ptr);
            free(ptr);
            return 0;
        }
    

在上面的代碼中,getPointer函數返回一個指向int類型變數的指針變數,其中指針變數所指向的int型變數的值為函數傳入的參數value。在主函數中,我們調用getPointer函數,並將其返回的指針變數的值列印出來。

九、指針與函數的關係區別

指針是一種數據類型,可以指向內存中存儲的任何數據類型,包括函數。

指向函數的指針變數的用法:

    
        int add(int a, int b);
        int main() {
            int (*func)(int, int) = add;
            int result = func(1, 2);
            return 0;
        }
        int add(int a, int b) {
            return a + b;
        }
    

上面的代碼中,定義了一個指向函數add的函數指針變數func。在主函數中,我們遍歷函數指針表,依次調用指向的函數。

十、函數指針和回調函數

函數指針可以作為回調函數使用,回調函數是指在某個事件發生時由系統調用的函數。

函數指針作為回調函數的用法:

    
        void invoke( void (*cb)(const char*) ) {
            cb("hello");
        }
        void myCallback(const char* str) {
            printf("%s", str);
        }
        int main() {
            invoke(myCallback);
            return 0;
        }
    

上面的代碼中,myCallback函數是一個回調函數,它被invoke函數在事件發生時調用。在主函數中,我們調用invoke函數,並把myCallback函數的指針作為參數傳遞給它。

原創文章,作者:FHMM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/131630.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
FHMM的頭像FHMM
上一篇 2024-10-03 23:46
下一篇 2024-10-03 23:46

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字元串操作中,capitalize函數常常被用到,這個函數可以使字元串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機列印函數

    單片機列印是指通過串口或並口將一些數據列印到終端設備上。在單片機應用中,列印非常重要。正確的列印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的列印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變數時顯示的指定變數類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Sublime Test與Python的區別

    Sublime Text是一款流行的文本編輯器,而Python是一種廣泛使用的編程語言。雖然Sublime Text可以用於編寫Python代碼,但它們之間有很多不同之處。接下來從…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29

發表回復

登錄後才能評論