(1)變數名的回顧
①變數是一段實際連續儲存空間的別名,程式中通過變數來申請並命名儲存空間
②通過變數的名字可以使用儲存空間。(變數的名字就是變數的值,&變數名是取位址操作)
(2)c++中新增加了引用的概念
①引用可以看作乙個己定義變數的別名
②引用的語法:type& name = var; //type 為型別名,name 為引用的名字,var為己定義的變數名
③普通引用在定義時必須用同型別的變數進行初始化,函式引數引用的初始化發生在函式被呼叫時。
#include int(3)引用作為變數別名而存在,因此在一些場合可以代替指標main()
(4)引用相對於指標來說,具有更好的可讀性和實用性
(1)const type& name = var; //讓變數擁有唯讀屬性
(2)當使用常量對 const 引用進行初始化時,c++編譯器會為這個常量值分配空間,並將引用名作為這段空間的別名。但這樣用常量對 const 引用初始化將生成的是乙個唯讀變數。
#include void(1)引用在 c++中的內部實現是乙個常量指標,因此引用所占用的空間大小與指標相同。example()
void
demo()
intmain()
(2)從使用的角度,引用只是乙個別名,c++為了實用性而隱藏了引用的儲存空間這一細節。
①在編譯過程中,編譯器看到 int& a 的宣告就會轉換為 int* const a;
②看到使用引用時,會轉為*a,如此隱藏了使用指標的事實。
#include struct引用的儲存空間tref
;int
main()
; printf(
"sizeof(char&) = %d\n
", sizeof(char&));//
1,char型變數別名,大小為1
printf("
sizeof(rc) = %d\n
", sizeof(rc)); //
1,變數c的別名,大小為1
printf(
"sizeof(tref) = %d\n
", sizeof(tref)); //
結構體內有個引用,本質為指標,佔4位元組
printf("
sizeof(ref.r)= %d\n
", sizeof(ref.r)); //
1,char型變數的別名,大小為1
return0;
}
#include struct(1)功能性:引用在大多數情況下代替指標,可以滿足需要使用指標的場合tref
;int
main()
; printf(
"sizeof(r) = %d\n
", sizeof(r)); //
12 printf("
sizeof(r.before) = %d\n
", sizeof(r.before)); //
4 printf("
sizeof(r.after) = %d\n
", sizeof(r.after)); //
4 printf("
&r.before = %p\n
", &r.before);
printf(
"&r.after = %p\n
", &r.after); //
after和before相差8個位元組,中間隔了個b引用所占用的空間
return0;
}
(2)安全性:可以避開由於指標操作不當而帶來的記憶體錯誤
(3)操作性:簡單易用,又不失功能強大
函式返回引用
#include int&demo()引用作為變數別名而存在,旨在代替指標,引用在編譯器內部使用常量指標實現,其最終本質為指標,引用可以盡可能的避開記憶體錯誤。int&func()
intmain()
(1)const 常量的判別準則
①只有用字面量初始化的 const 常量才會進入符號表,如 const int i = 1;
②使用其它變數初始化的 const 常量仍然是唯讀變數。如 const int a = b;//a 為唯讀變數
③被 volatile 修飾的 const 常量不會進入符號表,如 volatile const int i = 1;//這時會為 i 分配記憶體,且 i 每次都是從記憶體中取值。加 const 只是說明 i 不能作為左值。
▲在編譯期間不能直接確定初始值的 const 識別符號,都被作為唯讀變數處理。
(2)const 引用的型別與初始化變數的型別
①當用變數來初始化與 const 引用時,如果兩者型別相同,則初始化變數成為唯讀變數。
②當用變數來初始化與 const 引用時,如果兩者型別不同,則將生成乙個新的變數,即引用的是另乙個新變數,而不是原來的用來初始化引用的那個變數。
#include int(1)指標與引用的不同main()
指標引用
初始化值是乙個記憶體位址,不需要初始化
必須在定義時初始化,之後無法代表其它變數
訪問記憶體
通過指標可以訪問對應記憶體位址中的值
對引用的操作(賦值,取位址等)都會傳遞到其代表的變數上。
const修飾
被const修飾成常量或唯讀變數。 如const int* p;//p
const引用,表示其代表的變數具有唯讀屬性。如,const int& a等價於const int* const a;
(2)從使用 c++語言的角度來看,引用與指標沒有任何關係。引用是變數的新名字,操作引用就是操作對應的變數。當進行 c++程式設計時,直接站在使用的角度看待引用,與指標毫無關係,引用就是變數的別名。
(3)從 c++編譯器的角度來看,在編譯器內部,使用指標常量來實現「引用」。因此,「引用」在定義時必須初始化。當對 c++**進行除錯分析時,一些特殊情況,可以考慮站在 c++編譯器的角度看待引用。
引用典型問題分析
#include int a = 1指標是乙個變數,而引用是乙個變數的新名字。const 引用能夠生成新的唯讀變數,編譯時不能直接確定初始值的 const 識別符號都是唯讀變數。;structsv;
intmain()
; printf(
"&sv.x = %p\n
", &sv.x);//
變數a的位址,全域性區
printf("
&sv.y = %p\n
", &sv.y); //
變數b的位址,棧
printf("
&sv.z = %p\n
",&sv.z); //
new出來的位址,堆
//在c++中沒有「引用陣列」的概念,請看如下分析
//對於陣列而言,其記憶體是連續分布的。當進行&array[1] - &array[0]
//表示前後兩個元素的位址相差的值,應等於sizeof(元素的型別)。
//但如果允許定義「引用陣列」的話,如下面語句,&array[1]表示第1個元素
//的位址,即元素b的位址(&b),而&array[0]表示&a,顯然這兩個位址是不連續的。
//所以int& array=;
//這樣的定義是錯誤的,c++裡不支援「引用陣列」
return0;
}
C 學習筆記2 C 變數
1 當乙個精度高的資料型別與乙個精度低的資料型別進行運算時,定義運算結果的變數型別必須與精度最高的變數型別相同。這是為了防止在運算過程中造成資料丟失。如下 double a 42.29 int b 4229 int c a b console.writeline c c console.readke...
C 學習筆記2 C 引用 vs 指標
引用很容易與指標混淆,它們之間有三個主要的不同 1.不存在空引用。引用必須連線到一塊合法的記憶體。2.一旦引用被初始化為乙個物件,就不能被指向到另乙個物件。指標可以在任何時候指向到另乙個物件。3.引用必須在建立時被初始化。指標可以在任何時間被初始化。void swap int a,int b 這裡需...
2 C 中的引用
一.c 中的布林型別 c 中的布林型別只有true 和 false。true代表真,編譯器用1表示。false代表假,編譯器用0表示。include int main int argc,char argv 二 三目運算子的公升級 c語言中,三木運算子只能返回變數值,不能當左值使用。在c 中三目運算子...