C C 函式指標 typedef簡化定義

2021-07-10 01:14:17 字數 3324 閱讀 6194

學習要點:

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

<

iostream

>

#include

<

string

>

using

namespace

std;

inttest(

inta);

void

main(

intargc,

char

*argv)  

inttest(

inta)

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

#include

<

iostream

>

#include

<

string

>

using

namespace

std;

inttest(

inta);

void

main(

intargc,

char

*argv)  

inttest(

inta)

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

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

#include

<

iostream

>

#include

<

string

>

using

namespace

std;  

inttest(

int);  

inttest2(

int(

*ra)(

int),

int);

void

main(

intargc,

char

*argv)    

inttest(

inta)

inttest2(

int(

*ra)(

int),

intb)

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

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

#include

<

iostream

>

#include

<

string

>

using

namespace

std;

void

t1()

void

t2()

void

t3()

void

main(

intargc,

char

*argv)    

;cout

<<

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

"<<

t1<<"|

"<]<<

endl;

cout

<]();

//錯誤!指標陣列是不能利用陣列下標操作呼叫函式的

typedef

void(*

fp)();

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

fp b=;

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

]();

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

cin.

get();}

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

void* a=;

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

#include

<

iostream

>

#include

<

string

>

using

namespace

std;

void

t1()

void

t2()

void

t3()

intmain(

intargc,

char

*argv)

; //

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

]();

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

cin.

get();

return0;

} 編譯:[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 的函式,那麼,它的位址就是函式的名字,這一點如同 陣列一樣,陣列的名字就是陣列的起始位址。定義乙個...