指標:
引用:
在指標和引用傳遞引數時,一般選則引用會比較安全一些,因為引用被初始化後就不能被更改了。當然也可以使用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 這樣是錯的,要明白 引...