C C 函式指標 typedef簡化定義

2021-06-26 12:23:04 字數 3122 閱讀 7012

學習要點:

1,函式位址的一般定義和typedef簡化定義;

2,函式位址的獲取;

3,a函式位址作為b函式引數的傳遞;

函式存放在記憶體的**區域內,它們同樣有位址.如果我們有乙個int test(int a)的函式,那麼,它的位址就是函式的名字,這一點如同

陣列一樣,陣列的名字就是陣列的起始位址。

定義乙個指向函式的指標用如下的形式,以上面的test()為例:

int (*fp)(int a);//這裡就定義了乙個指向函式(這個函式的引數僅僅為乙個int型別)的指標

一般定義方式:

data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn);

函式指標不能絕對不能指向不同型別,或者是帶不同形參的函式,這點尤其注意.

在定義函式指標的時候我們很容易犯如下的錯誤:

int *fp(int a);//這裡是錯誤的,因為按照結合性和優先順序來看就是先和()結合,然後變成了乙個返回整形指標的函式了,而不是函式指標.

下面我們來看乙個具體的例子:

#include 

#include <

string>

using

namespace std;

int test(

int a);

void main(

int argc,

char* argv)   

int test(

int a)

typedef定義可以簡化函式指標的定義,在定義乙個的時候感覺不出來,但定義多了就知道方便了,上面的**改寫成如下的形式:

#include 

#include <

string>

using

namespace std;

int test(

int a);

void main(

int argc,

char* argv)   

int test(

int a)  

函式指標同樣是可以作為引數傳遞給函式的,下面我們看個例子,仔細閱讀你將會發現它的用處,稍加推理可以很方便使我們進行一些複雜的程式設計工作。

//-------------------該例以上乙個例子作為基礎稍加了修改-----------------------------

#include 

#include <

string>   

using

namespace std;   

int test(

int);   

int test2(

int (*ra)(

int),

int);

void main(

int argc,

char* argv)     

int test(

int a)

int test2(

int (*ra)(

int),

int b)

//這裡定義了乙個名字為ra的函式指標

利用函式指標,我們可以構成指標陣列,更明確點的說法是構成指向函式的指標陣列,這麼說可能就容易理解的多了。

#include 

#include <

string>   

using

namespace std;

void t1()

void t2()

void t3()

void main(

int argc,

char* argv)      ;

cout<<"比較t1()的記憶體位址和陣列a[0]所儲存的位址是否一致"錯誤!指標陣列是不能利用陣列下標操作呼叫函式的

typedef 

void (*fp)();

//自定義乙個函式指標型別

fp b=; 

//利用自定義型別fp把b定義趁乙個指向函式的指標陣列

b[0]();

//現在利用指向函式的指標陣列進行下標操作就可以進行函式的間接呼叫了;

cin.

get(); }

仔細看上面的例子可能不用我多說大家也會知道是怎麼一會事情了,最後我們做乙個重點小結,只要記住這一點,對於理解利用函式指標構成陣列進行函式間接呼叫就很容易了!

void* a=;

cout<<"比較t1()的記憶體位址和陣列a[0]所儲存的位址是否一致"<

cout<

上面的這一小段中的錯誤行,為什麼不能這麼呼叫呢?

前一篇教程我們已經說的很清楚了,不過在這裡我們還是複習一下概念,指標陣列元素所儲存的只是乙個記憶體位址,既然只是個記憶體位址就

不可能進行a[0]()這樣位址帶括號的操作,而函式指標不同它是乙個例外,函式指標只所以這麼叫它就是因為它是指向函式指向記憶體的**區的指標

,它被系統授予允許與()括號操作的權利,進行間接的函式呼叫,既然函式指標允許這麼操作,那麼被定義成函式指標的陣列就一定是可以一樣的操作的。

對上一例子改動:

#include 

#include <

string>

using

namespace std;

void t1()

void t2()

void t3()

int main(

int argc,

char* argv) ; 

//利用自定義型別fp把b定義趁乙個指向函式的指標陣列

b[0]();

//現在利用指向函式的指標陣列進行下標操作就可以進行函式的間接呼叫了;

cin.

get();

return 0; }

編譯:[root@chn ]# g++ a.c -o a

a.c: in function `int main(int, char**)':

a.c:16: warning: the address of `void t1()', will always be `true'

[root@chn ]# ./a

t1=0x804881c

比較t1()的記憶體位址和陣列a[0]所儲存的位址是否一致1|0x804881c

test1

C C 函式指標 typedef簡化定義

學習要點 1,函式位址的一般定義和typedef簡化定義 2,函式位址的獲取 3,a函式位址作為b函式引數的傳遞 函式存放在記憶體的 區域內,它們同樣有位址.如果我們有乙個int test int a 的函式,那麼,它的位址就是函式的名字,這一點如同 陣列一樣,陣列的名字就是陣列的起始位址。定義乙個...

C C 函式指標 typedef簡化定義

學習要點 1,函式位址的一般定義和typedef簡化定義 2,函式位址的獲取 3,a函式位址作為b函式引數的傳遞 函式存放在記憶體的 區域內,它們同樣有位址.如果我們有乙個int test int a 的函式,那麼,它的位址就是函式的名字,這一點如同 陣列一樣,陣列的名字就是陣列的起始位址。定義乙個...

C C 函式指標 typedef簡化定義

學習要點 1,函式位址的一般定義和typedef簡化定義 2,函式位址的獲取 3,a函式位址作為b函式引數的傳遞 函式存放在記憶體的 區域內,它們同樣有位址.如果我們有乙個int test int a 的函式,那麼,它的位址就是函式的名字,這一點如同 陣列一樣,陣列的名字就是陣列的起始位址。定義乙個...