三 C 引用機制

2021-07-04 14:22:51 字數 2544 閱讀 3131

思考:

對於一段連續的儲存空間只能有乙個別名嗎?

肯定不是,因此我們可以給同乙個連續的儲存空間取多個別名,這就誕生了c++中的引用機制

示例:exp-1.cpp

#include 

int main(int argc, char *argv)

執行結果:

可見,a和b指向了同一記憶體塊!

tip:

普通引用在宣告時必須用其它的變數進行初始化。

示例:exp-2.cpp

#include 

void swap_q(int& a, int& b)

void swap_p(int

*pa, int

*pb)

int main(int argc, char *argv)

tip:

引用作為函式引數宣告時可不進行初始化。

const引用讓變數擁有唯讀屬性

示例:exp-3.cpp

#include 

int main(int argc, char *argv)

執行結果:

tip:

從執行結果來看,指向變數a的指標還是能成功的改變a的值,所以,此時只是無法通過常量引用b來修改a的值!

示例:exp-4.cpp

#include 

int main(int argc, char *argv)

tip:

使用常量對const引用初始化後將生成乙個唯讀變數。

經典問題:

#include 

int main()

執行結果:

從執行結果來看,上面的z是乙個唯讀變數,而非常量!

#include 

int main()

執行結果:

思考:

引用有自己的儲存空間嗎?

測試:exp-5.cpp

#include 

struct tref

;int main(int argc, char *argv)

執行結果:

tip:

從上面的結果可知,引用是有儲存空間的,那麼這又是為什麼呢?

- 引用在c++中的內部實現是乙個指標常量

- type& name <==> type* const name

improtance:

思考:既然引用變數有自己的儲存空間,如何獲得它的該空間的位址?

解答:無法通過「&」取位址符,獲得「引用變數」自身的儲存空間的位址,通過「&」取位址符得到的是它的目標變數的位址,引用機制在一開始設計時,就沒打算讓我們操作它本身,對它的所有操作都反應在目標變數上;而且,引用機制很容易被編譯器優化,優化後,原來訪問引用變數的**編譯成的機器**,實際上是直接訪問原變數,這樣的話,編譯器甚至可以不為引用變數分配空間,全部直接訪問它所引用的原變數。

舉例:exp-6.cpp

#include 

struct tref

;int main(int argc, char *argv)

; printf("&a = %p\n", &a);

printf("&ra.a = %p\n", &ra.a);

printf("&b = %p\n", &b);

printf("&ra.b = %p\n", &ra.b);

printf("&c = %p\n", &c);

printf("&ra.c = %p\n", &ra.c);

printf("&ra = %p\n", &ra);

printf("sizeof(tref) = %ld\n", sizeof(ra));

return

0;}

執行結果:

可見,對引用變數取位址,實際上得到的是其目標變數的位址!

若返回靜態變數或全域性變數

示例:exp-7.cpp

#include 

int& f()

int& g()

int main()

執行結果:

tip:

首先,g函式執行後,將區域性變數的引用返回並賦值給了變數a,所以a的值為0;然後,g函式執行後,將區域性變數賦值給乙個引用變數b,然後由於g函式執行完畢,系統釋放了呼叫g函式時的棧空間,導致b此時成為了乙個未知記憶體塊的引用,所以訪問它得到的是隨機值;最後,f函式執行後將它的靜態區域性變數的引用返回,然後作為左值給它賦值,所以值為10。

c 引用的內部機制

q1 引用是別名,引用必須初始化。為什麼必須被初始化呢?q2 include using namespace std int main int main int x 5,y 10 swap x,y cout after swap x 引用不能為空 必須初始化 現在要想讓引用指向在堆中開闢的一塊記憶體...

Java引用機制 reference

所謂引用傳遞就是指將堆記憶體空間的使用權交給多個棧記憶體空間。例子 1 例子 2 其中傳遞的是string物件,由於string的內容是不可以修改,所以str1的值還是hello,如果傳遞的是物件的string屬性,那是可以修改的 例子 3 傳遞的是物件的string屬性 一對一關係 例子 乙個人對...

C 學習(三) 引用

為了說明c 中引用這個概念引入的意義,我們不妨從乙個最基礎的c語言交換兩個變數的值的函式說起 swap int a,int b 呼叫時,使用如下語句 swap a,b 這裡,傳遞的是變數a和b的位址,我們要交換a和b的值,函式卻用的是a和b的位址作為引數,感覺沒有那麼直觀形象。c 引入了 引用 這個...