我有兩個問題:函數指針模糊在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?
我搜查在線,但所有的信息可用是關於使用和示例代碼創建函數指針。他們中沒有人說過他們是什麼,或者他們與普通指針有什麼不同。
所以我一定會錯過一些非常基本的東西。請指出我缺少的東西。 (對不起,因爲我的無知是一個初學者。)
你能解釋一下使用和展示時發生了什麼?我的意思是顯示錶示左值的地址。那麼?即使我們假設顯示自動轉換爲指向左值的指針(如在*顯示中),那麼&顯示也表示指針存儲的地址。那麼如何能夠:&display = * display或者&display = display? [我現在明白了爲什麼* display = display] –
'&display'沒有自動轉換。它不會*總是*發生。只有當函數被用作需要指針的操作符的參數時纔會發生。 '&'不。它需要一個左值並返回其地址。所以它明確地將一個函數轉換爲它的加號,而在其他例子中,轉換是隱式的。 –
好的..這有點令人困惑......那麼爲什麼:&f!= * f但是&display == * display? –