2017-01-10 58 views
3

我有兩個問題:函數指針模糊在C++

Q1)是函數名稱本身的指針?

如果它們是指針,那麼它們的值是什麼?

否則,如果它們不是指針,那麼, 它們是什麼,它們存儲了什麼值?

如果我們認爲函數名是指針。然後:

void display(){...} 

int main() 
{ 
    void (*p)(); 

    **p=display; //Works (justified**, because we are assigning one pointer into another) 

    **p=&display; //Works (Not justified** If function name is a pointer (let say type*) , then &display is of datatype : type**. Then how can we assign type** (i.e. &display) into type * (i.e. p)??) 

    **p=*display; //Works (Not justified** If function name is a pointer (type *) ,then, how can we assign type (i.e. *display) into type * (i.e. p) ??) 
} 

再次,

cout<<display<<";"<<&display<<";"<<*display;

打印類似:

爲0x1234; 0×1234;爲0x1234

[1234僅僅是示例]

[OMG !這怎麼可能 ?? 指針的地址,指向的地址和指向的地址的值如何都是相同的? Q2))在用戶定義的函數指針中存儲了什麼值?

考慮例如:

void display(){...} 

int main() 
{ 
    void (*f)(); 

    f=display; 

    f=*f; // Why does it work?? How can we assign type (i.e. *f) into type * (i.e. f). 

    cout<<f<<";"<<&f<<";"<<*f; 

    //Prints something like : 

    0x1234;0x6789;0x1234 
} 

[第一兩個輸出是有道理... 但是,在一個指針的值(地址它指向)如何可以等於存儲在所述尖頭的值地址?]

還是那句話:

f=*********f; // How can this work? 

我搜查在線,但所有的信息可用是關於使用和示例代碼創建函數指針。他們中沒有人說過他們是什麼,或者他們與普通指針有什麼不同。

所以我一定會錯過一些非常基本的東西。請指出我缺少的東西。 (對不起,因爲我的無知是一個初學者。)

回答

10

函數名是它們自己的指針嗎?

不過。在某些情況下,函數可以自動轉換爲指向函數的指針。該標準在第4.3節中提到:

函數類型T的左值可以轉換爲類型爲「指向T的指針」的prvalue。結果是指向該函數的指針。

(函數名稱指定一個左值,但函數類型可以有其他左值)。

在你的例子

p = display; 
p = *p; 

還有正是這種自動轉換。 display*p是函數類型的左值,並且在需要時,它們會自動並自動轉換爲指向函數類型。

p = *display; 

在這裏,轉換髮生兩次:第一display被轉換爲*操作者的指針,那麼它被廢棄時,然後被轉換成指針再次爲=操作者。

cout << display << ";" << &display << ";" << *display; 

這裏,display被轉換爲用於operator <<一個指針; &display已經是一個指針,因爲&是一個正常的地址接收操作符;並且*display被轉換爲operator <<的指針,而在其內部display被轉換爲operator *的指針。

f = *********f; 

此表達式中有很多此類轉換。數它們自己!

+0

你能解釋一下使用和展示時發生了什麼?我的意思是顯示錶示左值的地址。那麼?即使我們假設顯示自動轉換爲指向左值的指針(如在*顯示中),那麼&顯示也表示指針存儲的地址。那麼如何能夠:&display = * display或者&display = display? [我現在明白了爲什麼* display = display] –

+0

'&display'沒有自動轉換。它不會*總是*發生。只有當函數被用作需要指針的操作符的參數時纔會發生。 '&'不。它需要一個左值並返回其地址。所以它明確地將一個函數轉換爲它的加號,而在其他例子中,轉換是隱式的。 –

+0

好的..這有點令人困惑......那麼爲什麼:&f!= * f但是&display == * display? –