【轉】 C++易混知識點2. 函數指標和指標函數的區別

來源:互聯網
上載者:User

標籤:

我們時常在C++開發中用到指標,指標的好處是開銷很小,可以很方便的用來實現想要的功能,當然,這裡也要涉及到指標的一些基本概念。指標不是基礎資料型別 (Elementary Data Type),我們可以理解他為一種特殊類型的對象,他佔據一定空間,但是所帶來的好處就是C++如此強大的深層次原因了。


轉載請註明出處: http://blog.csdn.net/elfprincexu


1. 指標函數, ( __type__ * func( void, int,) )顧名思義,他是一個函數,只不過和一般函數區分的原因是它返回的是一個指標。
int* f ( int , int ) ; // 返回的是一個整形指標
int  f ( int, int);// 返回的是一個整形數
上面兩個區別的僅僅是傳回值得不同,(注意順便說下,傳回值不同可不是重載函數,重載函數只根據形參的類型和個數,當然,唯讀函數const也是重載函數的判斷依據)
當然,指標函數在使用時,必須與調用者的類型相同, 也就是說,傳回值必須和左值的類型相同。
int * a = f (5,67) ; // 合法,類型相同
總結: 指標函數,比較容易懂,和一般函數的區別僅僅是傳回值得不同,調用時注意返回的類型指標。


2. 函數指標 (__type__ (* func)(void*, int))

函數指標,顧名思義,還是一個指標,只不過這個指標比較特殊,他和其他函數名一樣,具有(傳回值類型,形參個數和類型)

int (*pFunc) (int , float) ;  // 合法,定義了一個函數指標pFunc,該函數指標具有 返回int類型,同時帶有兩個形參,一個是int, 另一個是float;

我們可以簡單理解為函數指標和一般的函數名一樣,其實,一般情況下,函數名所代表的含義就是一個函數入口地址(指標)。 

int getSum (int a, float b);

pFunc = getSum;//合法,函數名也可以理解為指標

pFunc = &getSum;  // 合法,& 去地址符可以省略

int x = (*pFunc)(3,50;// 合法,使用函數指標調用時,我們需要用挂號將它包圍使用,

void (*funcp)();  
void FileFunc(),EditFunc();  
main()  
{  
   funcp=FileFunc;  
  (*funcp)();  
  funcp=EditFunc;  
  (*funcp)();  
}  
void FileFunc()  
{  
   printf(FileFunc\n);  
}  
void EditFunc()  
{  
   printf(EditFunc\n);  
}  
程式輸出為:  
FileFunc  
EditFunc  


總結: 函數指標,本質是指標,不過代表的是一個函數入口地址,我們可以用該指標靈活的使用不同的函數。


在一般情況下,函數指標比較常用,他可以靈活的使用不同的函數來實現我們想要的結果。比如在常見的C++應用中,我們往往會定義一個函數指標,該函數指標通過繼承來實現不同的實現。

class ThreadUser  
{     
    public:  
    typedef void (ThreadUser::*EntryPtr)(void * arg)    ;// 定義了一個函數指標EntryPtr, 參數為無類型指標,傳回值為空白值void  
}  
class Thread  

{  
    public:  
    Thread(ThreadUser&, ThreadUser::EntryPtr, void* arg = 0 );  
    ...  
    private:  
    pthread_t _thread;  
    pthread_attr_t _threadAtrributes;  
    Thread::EntryPt _entry;  
    ThreadUser* _user;  
    bool    _done; void * _arg;  
    static void entry(Thread&);// 線程入口函數  
    static int _threadCount;  
}  

義:  
// 定義另一個函數指標,為pthread_create服務,pthread_create 線程入口函數start_rtn需要此類型函數  

typedef void* (*EntryPoint)(void*); Thread::Thread(ThreadUser& u, ThreadUser::EntryPtr e, void* arg ) : _entry(e), _user(&u), _done(false), _arg(arg)   

{  
    memset (&_thread, 0, sizeof (_thread);  
    memset(&_threadAttributes, 0, sizeof (_threadAttributes);  
    int thrCreateResult;  
    if ((thrCreateResult = pthread_create(&_thread,&_threadAttributes, (EntryPoint)entry, this)) != 0) // this 作為入口函數的argu  
    {  
        cerr << "pthread_create failed " << errno << endl;  
    }  
    else   
    {  
        _started = true;  
        _threadCount ++;  
    }  
    return true;  
}  
  
void Thread::entry(Thread& t)// 入口函數,形參為Thread 對象,在上面this  
{  
    (t._user->*t._entry)(t._arg);            // 調用該函數指標所指向的函數  
    t._done = true;  
}  

 

【轉】 C++易混知識點2. 函數指標和指標函數的區別

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.