標籤:

函數是指針吧?函數在內存中是怎樣儲存的

c++中 函數是指針吧?函數在內存中是怎樣儲存的


函數是函數,指針是指針

函數就是一段機器碼


函數不是指針,函數就是函數。函數指針就是另一回事了。

c++中不保證你的函數在內存里有確定的地址。

你需要學習點彙編,以及了解下計算機結構。

在大部分情況下函數是一段機器碼,函數指針的實現就是保存那段機器碼的地址。

也許讓你感到迷惑的是函數指針可以用函數調用一樣的語法來調用對應的函數。這是句法的問題。


函數不是指針。


我來告訴你把,函數明是一個指針,你比如說void pointer(int a,intb)

{

代碼

}

(我以arm9一類的處理器為例,都一樣(我就不說別的編譯知識了))

這段代碼在編譯的時候被編譯成彙編

pointer 0x1234 函數體

0x1238 函數體

......

0x1258函數體結束

0x1264其他代碼

在彙編裡面我們把pointer叫做標號,也就是對應高級語言裡面的函數名,那函數名(或者那個彙編裡面的標號)又帶表什麼呢 ,你會發現pointer標號前面有一個0x1234,這個數字就是一個地址,並且從這個地址開始就開始存儲了代碼,也就是這個函數體,所以說你所說的函數指針就是函數的名字 它指向了一塊存儲代碼(函數體)的內存

要是不懂可以在問我.....


函數不是指針,函數在內存中是一段可執行代碼。函數指針一般指向函數的入口。

只是在 C/C++ 中,函數指針解引用的函數「對象」(函數不是對象)會被當成函數指針處理。

所以函數指針,以及無重載的函數名可以不限次數地解引用,效果和不用解引用的形式相同。

譬如你可以把 printf 換成 (*printf) 、(***printf) 等等,都可以編譯,結果都是一樣的。


1、題主想的對,但描述的有偏差,函數和指針是兩個東西,不能用「是」來劃等號。指針全稱是指針變數,是存著地址的變數,所以函數是有個地址,但不能說函數是指針,平常都是直接通過地址調用函數,你也可以把函數地址存到指針裡面。

2、函數在內存中就是一段代碼,起始位置叫函數入口,也就是函數地址,其他代碼通過這個地址調用函數,有時候需要把函數提供給外部使用,就需要把函數地址列成一個表放在文件頭部,這些列出的函數就叫導出函數。函數有很多種,除了普通的函數,還有類成員函數、類虛函數、類靜態函數等,有的是訪問許可權不一樣(比如類成員函數和類靜態函數),調用過程不一樣(虛函數),有的是編譯期行為,有的是運行時行為,但這些函數本身的存在形式都是一樣的,就是函數入口加上一段代碼。


大部分平台下函數的指針就指向一段機器碼


函數不是指針。

一般來說,編譯到x86,程序會生成數據段、代碼段、堆棧段、附加段。

如果你的程序沒有做特殊處理的話,函數一般是放在代碼段的,當然你也可以放在別的段,然後通過執行別的指令解碼再執行。

當然不同的程序語言的函數在編譯到彙編時還會有一些差別,但總體來說還是這樣的。

以C++為例:

class Foo{
private:
int a;
public:
void fooFunc(){}
virtual void vFunc();
}

class Bar:public Foo{
private:
int b;
public:
void barFunc(){}
void vFunc(){}
}

在C++中,

如果你的函數不是虛函數( fooFunc 、barFunc),那麼你調用函數的時候就是靜態調用,編譯器會插入跳轉到內存中代碼段里對應的函數的地址,每個類的實例不會佔用多餘的存儲空間。

如果你的函數是虛函數( vFunc ),那麼每一個對象實例就會攜帶一個虛指針,通常這個指針在對象實例的首部,這是為了保證訪問虛函數表擁有高性能(尤其是當多重繼承的時候)。虛指針指向類的虛函數表,然後找到需要調用的函數的指針,然後再跳轉到那兒。


函數一般就是一段目標代碼而已

函數指針是指向它的實地址或虛地址,一般由編譯器或鏈接器確定,有時候還要由系統重分配(ASLR)

話說感覺入門編程不應當用與操作系統和組成原理關係過於密切的C/C++,而應該用python,ruby或者更抽象點的haskell什麼的


函數名是一個指針,它指向一塊內存地址。這個地址上存放了函數體。

順便~

函數指針,是一個指針,它指向一個函數。

指針函數,是一個函數,它的返回值是指針。


我還想知道人類是怎麼讓計算機識別各種數據的。原諒我是小白。


函數不是指針

想知道是怎麼存儲的?

歡迎入編譯器大坑


推薦閱讀:

dll和exe在內存運行時有什麼區別?
c++ 在使用vector::push_back時是否需要使用try...catch...包裹起來?
C++ 需要 restrict 關鍵字嗎?
在校學生深入學習QT後會不會找不到比較好的工作?
如何編寫異常代碼?比如處理bad-alloc的時候,是不是應該先銷毀當前資源?

TAG:C | 指針 |