国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

C/C++中函數(shù)指針的含義

2019-11-17 05:04:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  函數(shù)存放在內(nèi)存的代碼區(qū)域內(nèi),它們同樣有地址,我們?nèi)绾文塬@得函數(shù)的地址呢?

  假如我們有一個(gè)int test(int a)的函數(shù),那么,它的地址就是函數(shù)的名字,這一點(diǎn)如同數(shù)組一樣,數(shù)組的名字就是數(shù)組的起始地址。
  定義一個(gè)指向函數(shù)的指針用如下的形式,以上面的test()為例: int (*fp)(int a);//這里就定義了一個(gè)指向函數(shù)的指針   函數(shù)指針不能絕對(duì)不能指向不同類型,或者是帶不同形參的函數(shù),在定義函數(shù)指針的時(shí)候我們很輕易犯如下的錯(cuò)誤。int *fp(int a);//這里是錯(cuò)誤的,因?yàn)榘凑战Y(jié)合性和優(yōu)先級(jí)來(lái)看就是先和()結(jié)合,然后變成了一個(gè)返回整形指針的函數(shù)了,而不是函數(shù)指針,這一點(diǎn)尤其需要注重!   下面我們來(lái)看一個(gè)具體的例子:#include <iostream> 
#include <string> 
using namespace std; 
 
int test(int a); 
 
void main(int argc,char* argv[])   

    cout<<test<<endl;//顯示函數(shù)地址 
    int (*fp)(int a); 
    fp=test;//將函數(shù)test的地址賦給函數(shù)學(xué)指針fp 
    cout<<fp(5)<<""<<(*fp)(10)<<endl; 
//上面的輸出fp(5),這是標(biāo)準(zhǔn)c++的寫(xiě)法,(*fp)(10)這是兼容c語(yǔ)言的標(biāo)準(zhǔn)寫(xiě)法,兩種同意,但注重區(qū)分,避免寫(xiě)的程序產(chǎn)生移植性問(wèn)題! 
    cin.get(); 

 
int test(int a) 

    return a; 
}  typedef定義可以簡(jiǎn)化函數(shù)指針的定義,在定義一個(gè)的時(shí)候感覺(jué)不出來(lái),但定義多了就知道方便了,上面的代碼改寫(xiě)成如下的形式:#include <iostream> 
#include <string> 
using namespace std; 
 
int test(int a); 
 
void main(int argc,char* argv[])   

    cout<<test<<endl; 
    typedef int (*fp)(int a);//注重,這里不是生命函數(shù)指針,而是定義一個(gè)函數(shù)指針的類型,這個(gè)類型是自己定義的,類型名為fp 
    fp fpi;//這里利用自己定義的類型名fp定義了一個(gè)fpi的函數(shù)指針! 
    fpi=test; 
    cout<<fpi(5)<<""<<(*fpi)(10)<<endl; 
    cin.get(); 

 
int test(int a) 

    return a; 
} 更多文章 更多內(nèi)容請(qǐng)看C/C++技術(shù)專題專題,或   函數(shù)指針同樣是可以作為參數(shù)傳遞給函數(shù)的,下面我們看個(gè)例子,仔細(xì)閱讀你將會(huì)發(fā)現(xiàn)它的用處,稍加推理可以很方便我們進(jìn)行一些復(fù)雜的編程工作。
//-------------------該例以上一個(gè)例子作為基礎(chǔ)稍加了修改----------------------------- 

#include <iostream>   
#include <string>   
using namespace std;   
   
int test(int);   
 
int test2(int (*ra)(int),int); 
 
void main(int argc,char* argv[])     
{   
    cout<<test<<endl; 
    typedef int (*fp)(int);   
    fp fpi; 
    fpi=test;//fpi賦予test 函數(shù)的內(nèi)存地址 
 
    cout<<test2(fpi,1)<<endl;//這里調(diào)用test2函數(shù)的時(shí)候,這里把fpi所存儲(chǔ)的函數(shù)地址(test的函數(shù)地址)傳遞了給test2的第一個(gè)形參 
    cin.get(); 
}   
   
int test(int a) 
{   
    return a-1; 

 
int test2(int (*ra)(int),int b)//這里定義了一個(gè)名字為ra的函數(shù)指針 

    int c=ra(10)+b;//在調(diào)用之后,ra已經(jīng)指向fpi所指向的函數(shù)地址即test函數(shù) 
    return c; 
}   利用函數(shù)指針,我們可以構(gòu)成指針數(shù)組,更明確點(diǎn)的說(shuō)法是構(gòu)成指向函數(shù)的指針數(shù)組,這么說(shuō)可能就輕易理解的多了。#include <iostream>   
#include <string>   
using namespace std; 
 
void t1(){cout<<"test1";} 
void t2(){cout<<"test2";} 
void t3(){cout<<"test3";} 
void main(int argc,char* argv[])     

    void* a[]={t1,t2,t3}; 
    cout<<"比較t1()的內(nèi)存地址和數(shù)組a[0]所存儲(chǔ)的地址是否一致"<<t1<<""<<a[0]<<endl; 
 
    cout<<a[0]();//錯(cuò)誤!指針數(shù)組是不能利用數(shù)組下標(biāo)操作調(diào)用函數(shù)的 
 
    typedef void (*fp)();//自定義一個(gè)函數(shù)指針類型 
    fp b[]={t1,t2,t3}; //利用自定義類型fp把b[]定義趁一個(gè)指向函數(shù)的指針數(shù)組 
    b[0]();//現(xiàn)在利用指向函數(shù)的指針數(shù)組進(jìn)行下標(biāo)操作就可以進(jìn)行函數(shù)的間接調(diào)用了; 
    cin.get(); 
}   仔細(xì)看上面的例子可能不用我多說(shuō)大家也會(huì)知道是怎么一會(huì)事情了,最后我們做一個(gè)重點(diǎn)小結(jié),只要記住這一點(diǎn),對(duì)于理解利用函數(shù)指針構(gòu)成數(shù)組進(jìn)行函數(shù)間接調(diào)用就很輕易了! void* a[]={t1,t2,t3};
cout<<"比較t1()的內(nèi)存地址和數(shù)組a[0]所存儲(chǔ)的地址是否一致"<<t1<<""<<a[0]<<endl;

cout<<a[0]();//錯(cuò)誤!指針數(shù)組是不能利用數(shù)組下標(biāo)操作調(diào)用函數(shù)的   上面的這一小段中的錯(cuò)誤行,為什么不能這么調(diào)用呢?

  前一篇教程我們已經(jīng)說(shuō)的很清楚了,不過(guò)在這里我們還是復(fù)習(xí)一下概念,指針數(shù)組元素所保存的只是一個(gè)內(nèi)存地址,既然只是個(gè)內(nèi)存地址就不可能進(jìn)行a[0]()這樣地址帶括號(hào)的操作,而函數(shù)指針不同它是一個(gè)例外,函數(shù)指針只所以這么叫它就是因?yàn)樗侵赶蚝瘮?shù)指向內(nèi)存的代碼區(qū)的指針,它被系統(tǒng)授予答應(yīng)與()括號(hào)操作的權(quán)利,進(jìn)行間接的函數(shù)調(diào)用,既然函數(shù)指針答應(yīng)這么操作,那么被定義成函數(shù)指針的數(shù)組就一定是可以一樣的操作的。 更多文章 更多內(nèi)容請(qǐng)看C/C++技術(shù)專題專題,


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临桂县| 临城县| 福泉市| 云南省| 姚安县| 华蓥市| 抚远县| 宜阳县| 成都市| 蓬莱市| SHOW| 连山| 新泰市| 聂荣县| 兴安县| 河曲县| 滨州市| 社会| 嘉义县| 永新县| 旺苍县| 大同县| 全州县| 大厂| 千阳县| 靖江市| 广灵县| 满城县| 萨迦县| 毕节市| 江永县| 临潭县| 南昌市| 馆陶县| 无极县| 子洲县| 东源县| 木兰县| 财经| 舒兰市| 高邑县|