C语言中函数指针和指针函数
函數(shù)指針
函數(shù)指針:首先它是一個(gè)指針,指向一個(gè)函數(shù)。
一般聲明單個(gè)指針類型如下:
p就是一個(gè)int類型的指針,它指向一個(gè)int類型變量的地址。
賦值:
將a的地址給p,對(duì)p進(jìn)行解引用,p就等于0,如果對(duì)p進(jìn)行修改,同時(shí)也會(huì)改變a的值。
而函數(shù)指針就像整形指針一樣,它指向一個(gè)函數(shù)的地址。
有一個(gè)函數(shù)聲明如下:
如何要聲明一個(gè)指針指向這個(gè)函數(shù)
int (*p)() = test; 或者 int (*p)() = &test;&沒必要寫,因?yàn)楹瘮?shù)名本身就代表了一個(gè)地址。
此時(shí)p就是一個(gè)指向test的指針
使用p:
調(diào)用指針p,并將返回值賦值給a,=,但p后面的()不能忘記,如果有參數(shù)可以參數(shù),沒參數(shù)也不能省略。
指針函數(shù)
指針函數(shù):簡單來說就是一個(gè)函數(shù)的返回類型是指針,它的根本是一個(gè)函數(shù)。
聲明一個(gè)返回值為int類型的指針:
如果返回類型是一個(gè)整形指針:
int *test(int *num) {return num; }()的優(yōu)先級(jí)高于*,所以test先跟()結(jié)合成為一個(gè)函數(shù),剩下的int *就是函數(shù)的返回類型。
例題解析
有一個(gè)語句如下:
(*(void(*)()0))();這是我在《C陷阱與缺陷》上面看到的一個(gè)例子,有興趣的可以看看這本書。
第一眼看上去不知道這是個(gè)啥,對(duì)它簡單的拆分來看:
使用x來代替void(*)()
就可以寫成下面這種形式
再使用y來代替(x)0
(*(y))() (*y)()此時(shí)(*y)()就非常容易理解
先看x代替的void(*)()
(*)是一個(gè)指針,指向一個(gè)void類型無返回值的函數(shù),x本質(zhì)是個(gè)指針
再看y代替的(x)0
將0強(qiáng)制類型轉(zhuǎn)換成x類型,也就是將0轉(zhuǎn)換成一個(gè)指向void類型的函數(shù)的指針。
最后看(*y)(),對(duì)y進(jìn)行解引用,也就是調(diào)用y所指向的函數(shù)。
有下面語句
void (*signal(int))(int)signal是一個(gè)函數(shù),函數(shù)的參數(shù)為int類型,返回值是一個(gè)函數(shù)指針,調(diào)用該函數(shù),這個(gè)函數(shù)的參數(shù)為int類型,返回值為void類型。
總結(jié)
以上是生活随笔為你收集整理的C语言中函数指针和指针函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里视频播放vodPlayer.setM
- 下一篇: DolbyAudio访问杜比音效驱动程序