深入理解C語言函數指標

來源:互聯網
上載者:User

樣本1:

void myFun(int x);    //聲明也可寫成:void myFun( int );int main(){    myFun(100);//一般的函數調用    return 0;}void myFun(int x){    printf("myFun: %d\n",x);}
我們一開始只是從功能上或者說從數學意義上理解myFun這個函數,知道myFun函數名代表的是一個功能(或是說一段代碼)。函數名到底又是什麼東西呢?   函數指標變數     一個資料變數的記憶體位址可以儲存在相應的指標變數中,函數的首地址也以儲存在某個函數指標變數中。這樣,我就可以通過這個函數指標變數來調用所指向的函數了。     在C系列語言中,任何一個變數,總是要先聲明,之後才能使用的。函數指標變數也應該要先聲明。     函數指標變數的聲明:     void (*funP)(int) ;   //聲明一個指向同樣參數、傳回值的函數指標變數。    (整個函數指標變數的聲明格式如同函數myFun的聲明處一樣,只不過——我們把myFun改成(*funP)而已,這樣就有了一個能指向myFun函數的指標了。當然,這個funP指標變數也可以指向所有其它具有相同參數及傳回值的函數。)  樣本2:
#include <stdio.h>#include <stdlib.h>void (*funP)(int);   //聲明也可寫成void(*funP)(int x),但習慣上一般不這樣。void (*funA)(int);void myFun(int x);    //聲明也可寫成:void myFun( int );int main(){    //一般的函數調用    myFun(100);    //myFun與funP的類型關係類似於int 與int *的關係。    funP=&myFun;  //將myFun函數的地址賦給funP變數    (*funP)(200);  //通過函數指標變數來調用函數    //myFun與funA的類型關係類似於int 與int 的關係。    funA=myFun;    funA(300);    //三個貌似錯亂的調用    funP(400);    (*funA)(600);    (*myFun)(1000);    return 0;}void myFun(int x){    printf("myFun: %d\n",x);}

輸出:

  總結:1、 其實,myFun的函數名與funP、funA函數指標都是一樣的,即都是函數指標。myFun函數名是一個函數指標常量,而funP、funA是函數數指標變數,這是它們的關係。2、但函數名調用如果都得如(*myFun)(10)這樣,那書寫與讀起來都是不方便和不習慣的。所以C語言的設計者們才會設計成又可允許myFun(10)這種形式地調用(這樣方便多了,並與數學中的函數形式一樣)。3、 為了統一調用方式,funP函數指標變數也可以funP(10)的形式來調用。4、賦值時,可以寫成funP=&myFun形式,也可以寫成funP=myFun。5、但是在聲明時,void myFun(int )不能寫成void (*myFun)(int )。void (*funP)(int )不能寫成void funP(int )。6、函數指標變數也可以存入一個數組內。數組的聲明方法:int (*fArray[10]) ( int );  樣本3
#include <stdio.h>#include <stdlib.h>void (*funP)(int);void (*funA)(int);void myFun(int x);int main(){    funP=&myFun;    //深入理解    printf("sizeof(myFun)=%d\n",sizeof(myFun));    printf("sizeof(funP)=%d\n",sizeof(funP));    printf("myFun\t 0x%p=0x%p\n",&myFun,myFun);    printf("funP\t 0x%p=0x%p\n",&funP,funP);    printf("funA\t 0x%p=0x%p\n",&funA,funA);    return 0;}void myFun(int x){    printf("myFun: %d\n",x);}

輸出:

  總結:1、函數指標變數跟普通的指標一樣在32位系統下大小都為4。但是函數指標常量的大小為1.
2、函數指標變數和函數指標常量儲存在記憶體的不同位置。3、為負值的函數指標變數(全域)的值為0。   函數指標作為某個函數的參數既然函數指標變數是一個變數,當然也可以作為某個函數的參數來使用的。樣本:
#include <stdio.h>#include <stdlib.h>typedef void(*FunType)(int);//前加一個typedef關鍵字,這樣就定義一個名為FunType函數指標類型,而不是一個FunType變數。//形式同 typedef int* PINT;void myFun(int x);void hisFun(int x);void herFun(int x);void callFun(FunType fp,int x);int main(){    callFun(myFun,100);//傳入函數指標常量,作為回呼函數    callFun(hisFun,200);    callFun(herFun,300);    return 0;}void callFun(FunType fp,int x){    fp(x);//通過fp的指標執行傳遞進來的函數,注意fp所指的函數有一個參數}void myFun(int x){    printf("myFun: %d\n",x);}void hisFun(int x){    printf("hisFun: %d\n",x);}void herFun(int x){    printf("herFun: %d\n",x);}

輸出:

  參考http://blog.pfan.cn/whyhappy/6030.html (轉載請註明出處 ^.^)  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.