C 深度解析教程學習筆記(2)C 中的引用

2022-06-25 19:12:09 字數 3930 閱讀 5106

(1)變數名的回顧 

①變數是一段實際連續儲存空間的別名,程式中通過變數來申請並命名儲存空間

②通過變數的名字可以使用儲存空間。(變數的名字就是變數的值,&變數名是取位址操作)

(2)c++中新增加了引用的概念

①引用可以看作乙個己定義變數的別名

②引用的語法:type& name = var; //type 為型別名,name 為引用的名字,var為己定義的變數名

③普通引用在定義時必須用同型別的變數進行初始化,函式引數引用的初始化發生在函式被呼叫時。

#include int

main()

(3)引用作為變數別名而存在,因此在一些場合可以代替指標

(4)引用相對於指標來說,具有更好的可讀性和實用性

(1)const type& name = var; //讓變數擁有唯讀屬性

(2)當使用常量對 const 引用進行初始化時,c++編譯器會為這個常量值分配空間,並將引用名作為這段空間的別名。但這樣用常量對 const 引用初始化將生成的是乙個唯讀變數。

#include void

example()

void

demo()

intmain()

(1)引用在 c++中的內部實現是乙個常量指標,因此引用所占用的空間大小與指標相同。

(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

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;

}

(1)功能性:引用在大多數情況下代替指標,可以滿足需要使用指標的場合

(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

main()

(1)指標與引用的不同

指標引用

初始化值是乙個記憶體位址,不需要初始化

必須在定義時初始化,之後無法代表其它變數

訪問記憶體

通過指標可以訪問對應記憶體位址中的值

對引用的操作(賦值,取位址等)都會傳遞到其代表的變數上。

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

;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;

}

指標是乙個變數,而引用是乙個變數的新名字。const 引用能夠生成新的唯讀變數,編譯時不能直接確定初始值的 const 識別符號都是唯讀變數。

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 中三目運算子...