青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

MyMSDN

MyMSDN記錄開發新知道

指向函數的指針的一點理解

準確地講,本文所涉及的內容是C++中較難理解的,本文的目的不是在于將它們解釋清楚,因為這需要你循序漸進地做很多練習才可以??聪旅嬉粋€例子:

int (*func(bool real))(int, int)

你覺得它的返回值是什么?

這里就涉及到了如何理解指向函數的指針的問題了。一些來自C++教材的建議是從里向外解讀這個表達式,這里所謂的里面就是func(bool real),那么剩下的部分就是所謂的返回值了?有點生硬吧。下面就讓我們循序漸進地看看如何理解更好?

為什么會對這個表達式的返回值產生疑問?

要解決問題通常需要找出問題所在,這里是基于這樣一種思維定勢,那就是我們通常習慣于這樣一種聲明變量的方式:

int a;

這里我們聲明a是一個int類型的變量。而對于返回值,我們通常也是采用類似的方式,如一個返回值為int類型的函數通??梢砸韵旅娴姆绞竭M行聲明:

int func([params]);

因此我們慣性地認為返回值就是最左側的一個類型名,雖然這通常是對的,但是針對上面的那個例子則顯得十分尷尬。

讓我們看看一個指向函數的指針的聲明式:

int (*pCompare)(int, int);

這個指針的名字就是pCompare,令人奇怪的是pCompare并不是在整個聲明式的最右邊,類型也肯定不是int,而是一個復雜的表達式。讓我們用typedef來聲明就會發現typedef的使用也不太一樣。

typedef int (*PF)(int, int);

我們發現跟慣用的typedef *** ???;的方式也截然不同,在上面這個typedef過后,整個表達式可以被簡化成:

PF pCompare;

現在我們似乎就一見如故了,現在的表達式看起來中規中矩,普通的聲明都是類型名加變量名完成聲明,而函數指針的聲明則是在一個表達式中一個固定的位置進行聲明。

 

int (*       )(int, int);

在上文中劃線的部分即為聲明的部分,也就是這點不同讓我們逐漸迷失了方向。

現在讓我們寫一個返回指向函數的指針的函數,也就是返回值是PF的函數,這就像我們從返回int類型的變量到返回int類型值的函數一樣,因此使用以下方式即可:

PF func([params]);

現在讓我們擴展PF,將它還原,也就是把右側的func([params])部分移到那個橫線的位置上。現在我們就可以很輕松地理解本文開頭的那個函數,原來是返回值為int (*)(int, int)的函數

int (*func(bool real))(int, int)

以上劃線的部分也就是一個函數扣除返回值的部分。也就等價于

PF func(bool real)

至此你應該能夠分析更加復雜的表達式了。

下面的示例旨在幫助理解本文:

/*
 * main.cc
 *
 *  Created on: 2009-2-1
 *      Author: Volnet
 
*/

#include 
<stdlib.h>
#include 
<iostream>
using std::cout;
using std::endl;

int myCompare1(
        
int a, int b,
        
int (*Compare)(intint));
int realCompare(int a, int b);
int fakeCompare(int a, int b);

typedef 
int (*PF)(intint);
int myCompare2(
        
int a, int b,
        PF Compare);

PF getAPointerFunc1(
bool real);
int (*getAPointerFunc2(bool real))(intint);

int main(void){
    
int typeDeclared;
    typeDeclared 
= 1;

    
//PF pCompare;
    int (*pCompare)(intint);

    
if(pCompare == NULL)
        cout
<<"pCompare == NULL"<<endl;
    
else
    {
        cout
<<"pCompare != NULL"<<" pComapre = "<<pCompare<<endl;
    }

    cout
<<"Compare the pointer function."<<endl;
    cout
<<"The compare result is : "<<
        myCompare1(
65, realCompare)<<endl;

    cout
<<"It's the same to invoke realCompare & *realCompare : "<<
        myCompare1(
65*realCompare)<<endl;

    cout
<<"Using the typedef to predigest definition : "<<
        myCompare2(
87, realCompare)<<endl;

    cout
<<"Return a pointer from a function : "<<
        myCompare2(
1020, getAPointerFunc1(true))<<endl;

    cout
<<"Return a pointer from a function : "<<
        myCompare2(
2030, getAPointerFunc2(false))<<endl;

    
return EXIT_SUCCESS;
}

int myCompare1(
        
int a, int b,
        
int (*Compare)(intint)){
    
return Compare(a, b);
}
int realCompare(int a, int b){
    cout
<<"The realCompare has be invoked."<<endl;
    
if(a == b)
        
return 0;
    
if(a < b)
        
return -1;
    
else
        
return 1;
}

int fakeCompare(int a, int b){
    cout
<<"The fackCompare has be invoked."<<endl;
    
return 200;
}

int myCompare2(
        
int a, int b,
        PF Compare){
    
return Compare(a, b);
}

PF getAPointerFunc1(
bool real){
    
if(real)
        
return realCompare;
    
else return fakeCompare;
}

int (*getAPointerFunc2(bool real))(intint){
    
if(real)
        
return realCompare;
    
else return fakeCompare;
}

 


 

posted on 2009-02-01 18:24 volnet 閱讀(1674) 評論(2)  編輯 收藏 引用

評論

# re: 指向函數的指針的一點理解 2009-02-03 09:58 多多多多

我記得是從里向外, 從左到右看.因為編譯器就是這么解析的  回復  更多評論   

# re: 指向函數的指針的一點理解 2009-02-03 15:44 __ay

看完匯編就好理解多了
就是個函數地址
也就是用jpm指令改下他的那個指令寄存器的值...
嘿嘿...
沒特別聲明的話編譯器的確是從左往又壓參數的  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


特殊功能
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品高潮呻吟久久av无限| 久久黄色影院| 欧美日韩精选| 欧美成人视屏| 欧美xart系列高清| 欧美激情一区二区三区在线视频| 久久综合婷婷| 国产精品婷婷午夜在线观看| 狂野欧美一区| 欧美大片一区| 欧美午夜精品理论片a级大开眼界| 欧美激情一区二区三级高清视频| 欧美激情第4页| 99人久久精品视频最新地址| 日韩亚洲精品在线| 亚洲视频在线一区| 久久久91精品国产一区二区三区| 狼人社综合社区| 欧美午夜精品久久久久久久| 国产亚洲一区二区三区在线播放 | 欧美成人精品一区二区| 亚洲第一页自拍| 欧美sm极限捆绑bd| 99re8这里有精品热视频免费 | 午夜精品久久久久久久| 久久综合狠狠综合久久激情| 亚洲精品国产精品乱码不99| 午夜精品视频| 欧美成人精品一区二区| 国产精品一区在线播放| 亚洲人成网站999久久久综合| 亚洲午夜精品在线| 亚洲国产精品传媒在线观看 | 一区二区三区精品视频| 久久久久成人精品| 日韩亚洲国产欧美| 亚洲在线播放电影| 欧美大片在线影院| 黄色欧美成人| 欧美在线一二三| 亚洲国产欧美一区二区三区同亚洲 | 国产精品免费网站在线观看| 伊人蜜桃色噜噜激情综合| 亚洲一区二区三区免费视频| 欧美电影免费观看高清| 西西人体一区二区| 国产精品久久久久秋霞鲁丝| 日韩视频在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲午夜久久久久久尤物| 欧美理论在线| 亚洲区一区二区三区| 亚洲伦伦在线| 久久一区亚洲| 韩日精品视频一区| 欧美一级视频| 中文在线资源观看视频网站免费不卡| 久久免费视频在线观看| 国产亚洲欧洲| 韩日欧美一区二区三区| 欧美在线观看一区二区三区| 99精品国产高清一区二区| 欧美国产成人在线| 亚洲精品系列| 亚洲国产另类 国产精品国产免费| 午夜欧美大尺度福利影院在线看| 国产精品成人一区二区艾草| 亚洲婷婷免费| 亚洲视频在线观看视频| 国产精品视频久久一区| 欧美在线免费视频| 久久精品一二三区| 伊人一区二区三区久久精品| 免费成人在线观看视频| 中日韩在线视频| 国产精品久久久久久久久借妻| aa级大片欧美三级| 夜夜精品视频一区二区| 国产精品毛片| 欧美一区二区观看视频| 欧美一区二区三区视频在线观看| 国内外成人免费视频| 欧美高清视频一二三区| 欧美日韩在线不卡| 久久国产日韩| 欧美第一黄网免费网站| 亚洲欧美国内爽妇网| 久久精品亚洲国产奇米99| 亚洲日本无吗高清不卡| 久久蜜臀精品av| 免费观看一级特黄欧美大片| 一区二区三区久久久| 亚洲一区二区三区四区五区黄| 国产日韩欧美综合一区| 免费一级欧美在线大片| 欧美日韩中文字幕日韩欧美| 久久成人亚洲| 葵司免费一区二区三区四区五区| 亚洲美女精品一区| 亚洲一二三四久久| 在线日韩日本国产亚洲| 亚洲免费久久| 国产日韩欧美在线观看| 亚洲第一黄色| 国产精品v亚洲精品v日韩精品 | 亚洲精品国产精品乱码不99| 麻豆精品传媒视频| 一本色道久久88综合日韩精品| 亚洲神马久久| 欧美伊人久久久久久午夜久久久久| 久久在线免费观看| 麻豆成人av| 亚洲自拍偷拍一区| 免费看精品久久片| 欧美伊人精品成人久久综合97| 久久综合伊人77777| 亚洲精品在线视频| 性久久久久久久久久久久| 亚洲另类在线视频| 欧美一区二区三区免费在线看| 最新高清无码专区| 欧美一区二区三区男人的天堂| 中文精品99久久国产香蕉| 久久香蕉国产线看观看网| 午夜精品久久久久久久久久久久| 欧美黄色aaaa| 欧美国产日本| 激情小说亚洲一区| 欧美一区二区日韩| 香蕉精品999视频一区二区| 欧美日韩国产精品| 欧美大片va欧美在线播放| 韩国成人精品a∨在线观看| 午夜精品久久久久久久| 午夜伦理片一区| 国产精品乱码久久久久久| 99热在线精品观看| 亚洲在线免费视频| 国产精品久久婷婷六月丁香| 一区二区免费在线观看| 一区二区精品在线观看| 欧美激情片在线观看| 亚洲日本乱码在线观看| 一区二区电影免费观看| 欧美久久久久久蜜桃| 亚洲免费av片| 欧美一区二区三区免费看| 国产一区二区视频在线观看| 久久久久久网站| 亚洲激情一区二区| 亚洲伦理久久| 国产精品成人va在线观看| 亚洲欧美日韩综合国产aⅴ| 久久综合电影一区| 亚洲国产美女久久久久| 欧美1区3d| 夜夜嗨av一区二区三区四区| 欧美亚洲在线视频| 精品999在线观看| 久久综合色播五月| 亚洲人成在线观看一区二区 | 黄色精品网站| 六十路精品视频| 亚洲国产精品久久久久秋霞影院 | 欧美一区二区女人| 国产精品视频网站| 久久亚洲一区| 欧美福利一区二区三区| 午夜久久久久久| 欧美日韩国产精品一卡| 免费欧美在线| 亚洲高清不卡| 欧美高清不卡| 一本一本久久a久久精品综合麻豆| 久久久99国产精品免费| 极品少妇一区二区三区| 久久久91精品国产| 欧美成人亚洲成人日韩成人| 国产一区在线视频| 牛人盗摄一区二区三区视频| 亚洲美女在线看| 久久精品免视看| 国产欧美日韩专区发布| 快播亚洲色图| 一区二区高清视频在线观看| 蜜桃av一区二区| 日韩一区二区电影网| 国产精品久久午夜| 亚洲女人天堂av| 亚洲精品欧美日韩| 亚洲欧美制服中文字幕| 激情综合色综合久久| 国产农村妇女精品| 久久一区二区三区四区| 亚洲日韩欧美一区二区在线| 久久国产加勒比精品无码| 亚洲视频一区在线| 在线观看亚洲视频| 国产精品老女人精品视频| 免费不卡在线视频|