含義:引用可以看作乙個已定義變數的別名
格式: type& name = var;
舉例:
如果寫成如下方式都是錯的:int a =4;
int& b = a;
//b為a的別名
b =5
;//這裡操作b就是操作a,如果分別對a和b取址會發現位址相同,
//也就是說c++支援對同乙個位址起不同的別名。
意義:如果想讓乙個已經存在的變數擁有唯讀屬性,可以對其定義乙個const引用(別名)int
& b;
//引用在定義的時候需要初始化,也就是需要指出b是哪一段位址的別名,這裡沒有初始化故報錯。
float
& b = a;
//這裡型別不一致會導致錯誤
舉例1:
舉例2:int a;
const
int& b = a;
//const引用讓變數b擁有唯讀屬性
b =5
;//錯誤語法,因為變數b是唯讀屬性
int*p =
(int*)
&b;*p =5;
//正確語法,使用指標可以對該位址進行修改
如果用指標作為函式引數,就會如下(比較繁瑣):const
int& b =2;
//當使用const時,可以使用常量2對其初始化,
//c++編譯器會為該常量值分配空間,該空間的別名即為b,該空間的值不能直接修改,但也可以使用指標修改。
//如: int *p = (int *)&b; *p = 5; 這樣就修改了該空間的值。
如果用引用作為函式引數,就會如下:void
swap
(int
* a,
int* b)
intmain()
引用的實質:引用的本質為指標常量,旨在代替指標,盡可能的避開記憶體錯誤。void
swap
(int
& a,
int& b)
intmain()
type& name; 等價於 type* const name;
如void f(int& a) 等價於 void f(int* const a)
辯證的看:引用只能說相對指標操作更加安全,但並不代表不會出錯。如下:
執行結果:i=***x,j=2int
&func1()
//返回的值為引用
int&
func2()
intmain()
分析:a為函式的區域性變數,當執行完後a會被釋放,導致返回值不正常;
b為乙個靜態變數,函式執行完後仍存在,所以沒問題。
c++不支援引用陣列(補充)
int a =1;
int b =2;
int* pc =
newint(3
);//pc指向的是分配的堆空間
int& array=
;//這裡出錯,由於c++繼承了c語言的特性,
//陣列的元素位址在記憶體中是連續的,而這裡的
//元素為引用,既有堆空間、又有棧空間、而且位址
//也不連續,所以錯誤
C 基礎(05) 引用
1 引用就是給變數起乙個別名。其本質就是乙個指標常量 指標指向的位址不可以修改 int a 10 b 是a的別名。b和a所訪問的記憶體是相同的 int b a 2 注意事項 3 引用作為函式的引數 1 函式的引數傳遞可以為 值傳遞 位址傳遞 引用傳遞。其中值傳遞不會改變原來的變數內容,其相當於將原來...
C 基礎05 引用的基礎
變數名實質上是一段連續儲存空間的別名,是乙個標號 門牌號 程式中通過變數來申請並命名記憶體空間 通過變數的名字可以使用儲存空間 屬於c 編譯器對c的擴充套件 不能用c編譯器的角度思考引用 void main 普通引用必須初始化 void swap int a,int b 改變指標所指位址上的值 vo...
C 基礎語法 01 引用
變數名實質上是一段連續儲存空間的別名,程式通過變數來申請並命名記憶體空間,通過變數的名字可以使用儲存空間 c 中新增加的概念,引用可以看作乙個已定義變數的別名 定義引用的方式 type name var 引用作為其它變數的別,在一些場合可以代替指標,引用相對於指標來說具有更好的可讀性和實用性 引用在...