問一個函數指針問題?
12-30
int fun(int x)
{
return x&<=0?0:fun(x-1)+x; } int (*fp)(int); fp=fun; int a=(fp)(5); // // int a=(*fp)(5);// cout&<&<"##a="&<&
就是一樣的
C++中,對於全局函數指針和靜態成員函數指針來說有沒有*沒區別,但是非靜態成員函數指針那個*是必須要有不能省的,否則編譯器不知道那個是指針還是對象的成員變數
大部分計算機(很多嵌入式都是哈佛體系的)都是基於馮諾伊曼體系的,這種體系很重要的特點就是存儲程序,即內存中同時存儲數據和代碼。所以,指向內存數據的指針和指向函數的指針存儲的地址在本質上是相同的(都是一個整數,其位數為地址匯流排的根數),只是在使用這些地址的方法是不同的。普通指針用*來取其中的數據,函數指針用(...)來調用。
編譯器存在隱式轉換,將函數名轉換成指向函數首地址的指針
你可以試試(*********fp)(5);前面加100個*再試試。
hoho,曾經我也迷惑過。後來試了一下,發現兩個效果一樣。再後來得知是編譯器的功勞。倒是我們定義函數的時候用void func替代了void (*func)。
函數調用都是call函數代碼的首地址,這個首地址可以由函數名表示,也可以由指針表示。編譯時都編譯成相同的調用,執行時也是相同的動作。
推薦閱讀:
※自學c語言,有什麼好的建議或方法嗎?
※C++標準庫中有哪些危險函數?
※如何學好編程語言以及進行軟體開發?
※美劇《矽谷》第三季第一集神秘代碼寫的是什麼?
※C++ 有哪些鮮為人知的奇特操作?
TAG:CC |