傳指標和傳引用的區別以及指標和引用的區別

2021-09-08 16:18:32 字數 1881 閱讀 6135

一、引用:

引用的定義:引用是給另外乙個變數其別名,所以引用不會分配記憶體空間,引用是引入了物件的乙個同義詞。

例如:

point pt1(10,10);

point &pt2 = pt1;

上述的**,定義了pt2為pt1的引用。通過這樣的定義,pt2和pt1表示同一物件,需要特別注意的是,引用並不產生物件的副本,僅僅是物件的同義詞,因此當執行下面的語句之後

pt1.offset(2,2);
pt1和pt2就都具有相同的值,引用必須在定義的時候馬上被初始化,因為它必須是某個具體的東西的同義詞,你不能線定義乙個引用然後初始化它。下面的語句是非法的

point &pt3;

pt3 = pt1;

引用有兩個主要的用途:作為函式引數以及從函式中返回左值,在下面的內容中講到

二、指標傳遞

指標傳遞引數本質上是值傳遞,它所傳遞的是乙個位址值。值傳遞的過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本,當棧幀回退的時候這個區域性變數就不存在了。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值(這裡是在說實參指標本身的位址不會變)。舉例如下:

五、傳指標和傳引用的區別

雖然它們都是在被調函式棧空間上的乙個區域性變數,但是任何對於引用引數的處理都會通過乙個間接定址的方式操作到主函式中的相關變數。而對於指標傳遞的引數,如果改變被調函式中的指標位址,它將影響不到主調函式的相關變數。如果想通過指標引數傳遞來改變主調函式中的相關變數,那就得使用指向指標得指標,或者引用。

為了進一步了解對指標和引用得區別,我將從編譯得角度來闡述它們之間的關係

程式在編譯時分別將指標和引用新增到符號表上,符號表上記錄的是變數名及變數所對應位址。指標變數在符號表上對應的位址值為指標變數的位址值,而引用在符號表上對應的位址值為引用物件的位址值。符號表生成後就不會再改變,因此指標可以改變其指向的物件(指標變數中的值可以改),而引用物件則不能修改

六、指標和引用的相同點與不同點

不同點:(1)指標是乙個實體,需要分配記憶體空間,引用只是變數的別名,不需要分配記憶體空間

(2)引用在定義的時候必須進行初始化,以後不能夠改變(從一而終);指標在定義的時候不一定要初始化,並且指向的空間可變(見異思遷)。注:引用的值不能為null

(3)有多級指標,但是沒有多級引用

(4)引用沒有const,指標有const,const的指標不可變;(具體指沒有 int& const a這種形式,而const int& a是有

的,前者指引用本身即別名不可改變,引用本來就不可改變,所以不需要這種形式,後者指引用所指的值不可

改變)。

(5)sizeof 引用,得到的是指向的變數的大小,而 sizeof 指標 得到的是指標本身的大小

(6)指標和引用的自增(++)運算意義不一樣,指標是指向下乙個空間,引用是引用的變數值加1

(7)引用訪問乙個變數是直接訪問,而指標訪問乙個變數是間接訪問

(8)引用型別是安全的,而指標不是。(引用比指標多了型別檢查)

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

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

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

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

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

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