C 指標和引用的區別

2021-09-23 17:08:41 字數 1868 閱讀 7021

指標:

引用:

在指標和引用傳遞引數時,一般選則引用會比較安全一些,因為引用被初始化後就不能被更改了。當然也可以使用const指標

int *const p:指向int型別的const指標,指標不能更改,編譯階段會報錯

const int*p:指向const變數的int*指標,指標的值可以更改,但是指標所指的記憶體是無法修改的

如下形參是const指標,其指向是無法修改的,

void

print_value

(int

*const a)

引用例子示範:

從上面的執行的結果看,雖然引用是乙個別名,操作別名,就相當於操作原始變數。如上面引用變數位址和原始變數一致。

基於vs2010反彙編的結果來看,引用是申請記憶體的

0005154e  push        3

00051550 push 2

00051552 push 1

00051554 lea ecx,

[t1] #取出ti物件位址到ecx暫存器。

00051557 call `wmain'::`2'

::t_demo:

:t_demo (

515d0h)

36: t_demo &ref_t1 = t1;

//這裡定義引用ref_t1

0005155c lea eax,

[t1] #取出ti物件位址到eax暫存器。

0005155f mov dword ptr [ref_t1]

,eax //這裡將t1物件位址,儲存到ref_t1指向的記憶體中

37: t_demo *t1_addr =

&ref_t1;

00051562 mov eax,dword ptr [ref_t1]

//將ref_t1指向記憶體的內容,儲存到eax中

00051565 mov dword ptr [t1_addr]

,eax //將t1儲存到t1_addr指向的記憶體中。38:

int size_ref_t1 =

sizeof

(ref_t1)

;00051568 mov dword ptr [size_ref_t1]

,0ch

39:return0;

0005156f xor eax,eax

40:}

上面最重要的就是下面2行**,如果ref_t1,不申請記憶體的話,那麼第二行賦值語句肯定是要報錯的。探索到這裡,分析引用到底佔不占用記憶體,也沒多大意義。一般引用變數是區域性變數,使用之後不久就要釋放了。(網上也有人討論引用是不占用記憶體)

0005155c  lea         eax,[t1]  #取出ti物件位址到eax暫存器。

0005155f mov dword ptr [ref_t1],eax //這裡將t1物件位址,儲存到ref_t1指向的記憶體中

反彙編執行**

上面監聽能看到,引用位址和物件位址都是一樣的。但用sizeof去計算引用物件大小時,和其引用物件大小是一樣的。

C 引用和指標區別

一 引用簡介 引用就是某一變數 目標 的乙個別名,對引用的操作與對變數直接操作完全一樣。引用的宣告方法 型別識別符號 引用名 目標變數名 例1 int a int ra a 定義引用ra,它是變數a的引用,即別名 說明 1 在此不是求位址運算,而是起標識作用。2 型別識別符號是指目標變數的型別。3 ...

C 引用和指標的區別

很久沒寫過這類文章了,本來是想做下筆記,既然要做筆記,不如寫下部落格,就動起手來。文采不怎麼樣,還忘大家見諒 c 引用變數是c 中新增的一種復合型別,也就是說標準c語言中沒有引用變數。所謂引用,實際上就是乙個已定義變數的別名,別名我想大家小時候都有,應該可以理解,別名表示的是同乙個人,這裡引用變數和...

C 引用和指標的區別

c 引用和指標在間接使用其他物件的各種操作功能上面類似,但是兩者的不同之處也很明顯 1.指標本身佔據記憶體空間,但是引用只是乙個物件的別名,本身不分配記憶體空間 2.指標定義時可以不初始化,但是定義乙個引用必須進行初始化,並且初始化時只能是乙個物件 比如 int b 3.14 這樣是錯的,要明白 引...