指標和引用的區別

2021-09-29 19:36:56 字數 1621 閱讀 2401

貼上自

關於指標和引用的區別,首先要了解變數宣告的實質。

先看乙個**

inta=10;

該語句其實是在棧上分配了一塊記憶體空間,整數類變數占用4位元組,所以這句**的意思就是分配了一塊連續4位元組的記憶體空間,並往該空間存入10 。a代表著這塊記憶體空間的首位址(簡稱位址,下同),a是個代名,乙個標示符,這個名字只存在於源**,編譯之後就是個位址。

所以當定義乙個變數時,乙個變數其實包含兩個屬性,位址(占用記憶體空間)和值,名稱代表位址,而當執行賦值語句時,編譯器預設往a代表的位址中存入資料(存入所在記憶體空間),而不是改變位址。

再看一段**

inta=10;

int&b=a;

宣告乙個整數類的引用,名稱為b,如果說變數含有位址和值兩個屬性,那麼引用不能稱為變數,它不具備自己所代表的記憶體空間更沒有自己的值,它僅僅就是個代名詞,它什麼都沒有,所謂徒有虛名,沒有實質,它只是a的乙個別名,或者說它是借用了a的位址和值,當對b賦值或其他訪問時,等於直接在訪問a。編譯之後也是a的位址。

再看一段**

inta=10;

int*p=&a;

這段**的後一句宣告了乙個指標變數,並取a的位址賦值給p,既然是變數,它就包含2個屬性:位址和值,與其他變數不同,它專門用於儲存其他變數的位址(位址是個無符號整數,沒見過門牌號碼是負的^_^),此處p所在記憶體空間存入a的位址,當然p同樣代表自己的位址。

最後再看段**

voidmain()

voidfun1(int& c)

voidfun2(int* ptr)

上述**中定義完了後先呼叫fun1,fun1的形參是引用,因此主函式中將b傳入fun1,由於是引用,前面說過,引用只是個別名,它本身沒有位址空間,因此傳入的其實是a的位址。傳入後,編譯器對引用不做處理,因此在fun1函式體內,執行c++時,其實就是對a的值加一,編譯後c其實就是a的位址,這就是引用作為形參的呼叫情況。

雖然呼叫fun2,fun2的形參是指標變數,因此主函式中將p傳入fun2,由於p是個變數(指標變數),是變數都有自己的記憶體空間和值(此處p的值是a的位址),對於變數傳遞,編譯器會複製乙份值copy,因此在函式fun2內部,首先為ptr被分配乙個記憶體空間(建立區域性變數,函式退出時釋放),然後將外部p的值複製到ptr中,也就是a的位址被複製到ptr中。然後執行*ptr++,就是對ptr所指向的位址中的值加一,也就是對a的值加一。函式通過ptr間接對a操作。

總結:引用作為形參傳入函式時,不做任何處理直接使用,而指標作為形參傳入函式時,要為形參分配記憶體空間建立乙個臨時區域性變數,並將實參指標的值複製到形參中。

指標引用和引用指標的區別

c 在傳參的過程中,指標 和指標引用 是有區別的。雖然,我們往往可以通過傳指標然後通過間址訪問來修改指標所指向物件的值,同樣,通過引用也可以直接修改物件的值。但是,當傳指標的時候有乙個問題,就是,我們雖然可以通過指標來修改指標所指向物件的值,但是我們沒有不能直接修改指標的內容 也就是指標變數存放的位...

傳指標和傳指標引用的區別 指標和引用的區別(本質)

指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...

傳指標和傳指標引用的區別 指標和引用的區別(本質)

指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...