C語言指針/引用/取值
指針和指針的指針還有指針的引用的作用分別是什么啊
指針的與“引用”的區別
C++編程中指針與引用的區別
一、指針和引用的區別
(1)引用總是指向一個對象,沒有所謂的 null reference .所有當有可能指向一個對象也有可能不指向對象則必須使用 指針.
由于C++ 要求 reference 總是指向一個對象所以 reference要求有初值.
String & rs = string1;
由于沒有所謂的 null reference 所以在使用前不需要進行測試其是否有值,而使用指針則需要測試其的有效性.
(2)指針可以被重新賦值而reference則總是指向最初或地的對象.
(3)必須使用reference的場合. Operator[] 操作符 由于該操作符很特別地必須返回 [能夠被當做assignment 賦值對象] 的東西,所以需要給他返回一個 reference.
(4)其實引用在函數的參數中使用很經常.
void Get***(const int& a) //這樣使用了引用又可以保證不修改被引用的值
{
}
★ 相同點:
1. 都是地址的概念;
指針指向一塊內存,它的內容是所指內存的地址;引用是某塊內存的別名。
★ 區別:
1. 指針是一個實體,而引用僅是個別名;
2. 引用使用時無需解引用(*),指針需要解引用;
3. 引用只能在定義時被初始化一次,之后不可變;指針可變;
引用“從一而終”
4. 引用沒有 const,指針有 const,const 的指針不可變;
5. 引用不能為空,指針可以為空;
6. “sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或對象的地址)的大小;
typeid(T) == typeid(T&) 恒為真,sizeof(T) == sizeof(T&) 恒為真,
但是當引用作為成員時,其占用空間與指針相同(沒找到標準的規定)。
7. 指針和引用的自增(++)運算意義不一樣;
二、C++中指針傳遞與引用傳遞(進一步整理)
從概念上講。指針從本質上講就是存放變量地址的一個變量,在邏輯上是獨立的,它可以被改變,包括其所指向的地址的改變和其指向的地址中所存放的數據的改變。
而引用是一個別名,它在邏輯上不是獨立的,它的存在具有依附性,所以引用必須在一開始就被初始化,而且其引用的對象在其整個生命周期中是不能被改變的(自始至終只能依附于同一個變量)。
在C++中,指針和引用經常用于函數的參數傳遞,然而,指針傳遞參數和引用傳遞參數是有本質上的不同的:
指針傳遞參數本質上是值傳遞的方式,它所傳遞的是一個地址值。值傳遞過程中,被調函數的形式參數作為被調函數的局部變量處理,即在棧中開辟了內存空間以存放由主調函數放進來的實參的值,從而成為了實參的一個副本。值傳遞的特點是被調函數對形式參數的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值。(這里是在說實參指針本身的地址值不會變)
而在引用傳遞過程中,被調函數的形式參數雖然也作為局部變量在棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。
引用傳遞和指針傳遞是不同的,雖然它們都是在被調函數棧空間上的一個局部變量,但是任何對于引用參數的處理都會通過一個間接尋址的方式操作到主調函數中的相關變量。而對于指針傳遞的參數,如果改變被調函數中的指針地址,它將影響不到主調函數的相關變量。如果想通過指針參數傳遞來改變主調函數中的相關變量,那就得使用指向指針的指針,或者指針引用。
為了進一步加深大家對指針和引用的區別,下面我從編譯的角度來闡述它們之間的區別:
程序在編譯時分別將指針和引用添加到符號表上,符號表上記錄的是變量名及變量所對應地址。指針變量在符號表上對應的地址值為指針變量的地址值,而引用在符號表上對應的地址值為引用對象的地址值。符號表生成后就不會再改,因此指針可以改變其指向的對象(指針變量中的值可以改),而引用對象則不能修改。
最后,總結一下指針和引用的相同點和不同點:
★相同點:
●都是地址的概念;
指針指向一塊內存,它的內容是所指內存的地址;而引用則是某塊內存的別名。
★不同點:
●指針是一個實體,而引用僅是個別名;
●引用只能在定義時被初始化一次,之后不可變;指針可變;引用“從一而終”,指針可以“見異思遷”;
●引用沒有const,指針有const,const的指針不可變;(具體指沒有int& const a這種形式,而const int& a是有 的, 前者指引用本身即別名不可以改變,這是當然的,所以不需要這種形式,后者指引用所指的值不可以改變)
●引用不能為空,指針可以為空;
●“sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身的大小;
●指針和引用的自增(++)運算意義不一樣;
●引用是類型安全的,而指針不是(引用比指針多了類型檢查)
指針和引用的區別
指向指針的指針和指針的引用做函數參數怎樣理解,求大神解釋。
C++ 指針的引用問題
引用的地址就是被引用變量的地址。你把!=的情況直接輸出地址看看,我這里全等,應該是編譯器不同吧。
至于this,是個特殊的指針,一般我們自己定義的指針會分配一個內存空間,比如32位的地址會分配4字節的指針變量空間。然后指針賦值時,將某變量或對象的地址存入。但是this是編譯器確定的常量地址,this指向對象地址,它本身是對象內部的相對偏移量,當然沒有地址,所以無法引用。
一般基類指針和派生類指針不一樣,而當一個派生類創繼承的是虛基類,此時是一樣的。
下面看看this到底是個什么東西,調試時查看反匯編,見附圖:
函數返回this時,找到this指向的地址,取出后返回。
進入函數時,將CPU的基地址寄存器(ebp)入棧,也就是對象地址,初始化參數后。
第一行指令pop,彈棧到寄存器ecx
第二行是將ecx寄存器存入ebp-8的地址中,也就是在對象地址上面8個字節開始存放對象地址。
第三行根據this指針取得對象地址,存入寄存器eax。
注意這行的指令代碼(8B 45 F8)最后一個字節,F8的十進制是-8,顯然就是偏移量,是基地址的偏移量,所以this指向的就是ebp-8.而ebp-8的地址中正是第二行存入的基地址(對象地址)。
后面就是返回eax,觀察監視窗口,this和ecx寄存器的值是一樣的,該值就是對象地址,調試器已做了偏移量計算。
本文發布于:2023-02-28 20:21:00,感謝您對本站的認可!
本文鏈接:http://m.newhan.cn/zhishi/a/167767108181808.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:指針的引用.doc
本文 PDF 下載地址:指針的引用.pdf
| 留言與評論(共有 0 條評論) |