標籤:strong 檔案 問題 sp on c c++ r bs
指標和引用一直在用,但是卻從來沒有仔細思考過他們真正的區別在哪裡,一直都是照本宣科的理解,引用就是變數的別名,引用確定後就不能修改,原因是什麼呢?
現在就來弄清楚事情的真相, 區別究竟在哪裡?
下面這段話應該可以從本質上來解釋指標和引用的區別
程式在編譯的時候分別將指標和引用添加到符號表上, 符號表上記錄的是變數,以及變數所對應的地址, 指標變數在符號表上對應的地址為指標變數的地址值,而引用在符號表上對應的地址值為引用對象的地址值, 符號表產生後就不會再改,因此指標可以改變其指向的變數地址。 而引用對象則不能改。
ok, 看完這段話,我覺得關於指標和變數的區別,我們也可以真正理解了, 區別是什麼呢?
1. 指標 可以指向不同的變數,引用在定義的時候就確定了。
因為指標本身作為一個變數,在記憶體中是佔有一個空間的,這個地址裡邊存的值就是指標的目標地址, 當然作為一個變數,他當然可以隨意的修改值,即可以隨意的指向不同的變數
而引用呢! 在定義引用的時候,並沒有給他分配儲存空間,而只是在符號表裡給他添加了一條記錄,對應的地址根本就是原來的變數的地址。 所以說引用就是變數的一個別名
現在, 關於引用和指標的區別,已經搞清楚了,但是又有一個新問題, “符號表”, 符號表是個什麼玩意?怎麼產生的?
1. 在編譯過程中,編譯器會不斷彙集和反覆查證出現在來源程式中各種名字的屬性和特徵資訊等有關資訊, 這些資訊通常會儲存在一張或者幾張符號表裡。
2. 符號表每一項有兩部分, 一部分是名字(標示符), 另一部分是名字屬性(標示符的有關資訊), 就是我們上邊講到的標示符的地址
3. 編譯過程中,每當掃描器掃描出一個名字後,編譯器就查閱符號表,看其是否在在符號表中, 如果是一個新名字,那就加入符號表, 他的有關資訊將在詞法分析和語義分析過程中陸續加入符號表
4. 符號表是邊填邊用。
現在, 符號表已經弄清楚了,我又想到了一些跟符號表相關的一些知識
1. 為什麼C++可以實現重載, 那就是他在編譯的時候,在建立符號表的時候,做了一些手腳
2. 為什麼gdb需要加上-g, -g參數做了什麼事情, 就是因為在編譯的時候加了符號表
3. strip 做了什麼事情,為什麼可以使可執行檔變小? 去掉了符號表
由指標和引用的區別引發的思考