C語言基礎知識:函數指針&指針函數(定義格式、作用及用法說明)

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。https://mp.csdn.net/postedit/83150266

一、函數指針的實質(還是指針變量)

1、函數指針定義格式:類型名 (*函數名)(函數參數列表);

int (*pfun)(int, int);

2、函數指針的定義、賦值、調用

void func1(void)        //定義一個函數,以方便下面定義函數指針
{
	printf("test for function pointer.\n");
}

void (*pFunc)(void);    //函數指針定義
pFunc = func1; 	        //函數指針賦值
(*pFunc)();             //函數指針調用;用函數指針來調用以調用該函數,注意*pFunc要用()括起來
//pFunc();              //調用的第二種寫法,效果和上面一樣

3、函數指針作用:函數指針有兩個用途:調用函數和做函數的參數.

4、注意:函數指針聲明爲指針,它與變量指針不同之處是,它不是指向變量,而是指向函數

(1)函數指針的實質還是指針,還是指針變量。本身佔4字節(在32位系統中,所有的指針都是4字節)
(2)函數指針、數組指針、普通指針之間並沒有本質區別,區別在於指針指向的東西是個什麼玩意。
(3)函數的實質是一段代碼,這一段代碼在內存中是連續分佈的(一個函數的大括號括起來的所有語句將來編譯出來生成的可執行程序是連續的),所以對於函數來說很關鍵的就是函數中的第一句代碼的地址,這個地址就是所謂的函數地址,在C語言中用函數名這個符號來表示。
(4)結合函數的實質,函數指針其實就是一個普通變量,這個普通變量的類型是函數指針變量類型,它的值就是某個函數的地址(也就是它的函數名這個符號在編譯器中對應的地址值)


二、指針函數實質是一個函數

指針函數實質是一個函數。函數都有返回類型(如果不返回值,則爲無值型),只不過指針函數返回類型是某一類型的指針。

1、指針函數定義格式:類型名 *函數名(函數參數列表);

int *pfun(int, int);

2、指針函數的聲明、定義、調用

int * sum(int x); //指針函數的聲明;返回類型位一個指針變量 可以通過*p來獲取值

int * sum(int x){        //指針函數的定義
    int static sum =0;   //static 修身的變量在數據段;不會被函數棧回收
    int *p;
    int i;
    for(i=1;i<=x;i++){
        sum +=i;
    return p;     //返回類型是某一類型的指針
    }

int *p1;
p1 = fun(a);      //指針函數的調用

3、指針函數作用:可以在是代碼更簡潔並在一定程度節約內存;如當你需要返回一個數組中的元素時,你就只需返回首元素的地址給調用函數,調用函數即可操作該數組(讓函數返回多個值)。

或者是malloc函數動態分配內存,返回該內存的地址給另外一個函數,另一個函數纔好操作該內存。當然還有其他的作用,請讀者自行在實踐中體會。

4、注意:指針函數本質是一個函數,使用方法與普通函數沒什麼兩樣。既然是函數,就與變量不一樣。變量需要定義、賦值、調用(比如函數指針);而函數需要聲明、定義、調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章