《c++primer 5》中關於引用的描述是為物件起乙個別名,定義引用時,將引用和它的初始值繫結在一起。實際上定義乙個引用後,不會給引用再分配記憶體,引用的位址就是初始值的位址;
int a = 10;
int *b = &a;
int &c = a;
printf("a = %p\n",&a);
printf("b = %p\n",&b);
printf("c = %p",&c);
/*執行後會發現列印出來的 c 的位址和 a的位址一樣。而指標本身是需要分配記憶體的
*/
引用的用途如下:
①起別名:給後邊**要用到的變數起乙個較短的別名,而且能減少後邊使用時的拷貝構造。
datetime *cur_datetime = get_cur_datetime();
date &cur_date = cur_datetime->date;
//用cur_date 來代替cur_datetime->date,而且不會產生拷貝
std::cout<②引用傳參:
object obj;
void func(object obj);
//在函式呼叫時會對物件進行一次拷貝,建立乙個臨時物件常熟func函式
//效率低下且浪費資源
void func(object *obj);
//傳遞物件的指標,這樣免去了拷貝,但是這樣仍然不妥,因為有obj是空指標的可能,在函式中要判斷obj不是空指標再進行操作。
void func(const object &obj);
//引用的實現在彙編角度和指標一樣,因此並不會有效能的減少,而且引用必須初始化繫結乙個初始值,因此不會產生空指標
//作為引數時引用和const總是一起出現
③作為函式返回值:
//想要實現:
arrayint arr;//構造了乙個陣列物件
arr[10] = 10;//使用下標來訪問陣列物件中的乙個。
//實際上述呼叫等價於下方,在物件中對運算子進行了過載。
arr.operator(10) = 10;
//實現方法:
/*一.返回值為指標,但是存在缺點,比如你想訪問的時候要用一下方式
*(arr[10]) = 10; //並不能達到想要的目標
*/int *arrayint::operator(unsigned int index)
//返回值為引用,訪問時可以用arr[10] = 10來訪問;
int &arrayint::operator(unsigned int index)
1.指標可以不初始化,引用必須初始化
2.指標可以為空,引用不能為空
3指標可以更換目標,引用不能更換目標
關於引用和指標
首先最近複習了一下c 中引用的概念。引用在c 中的內部實現是乙個常指標。type name type const name。c 編譯器在編譯過程中使用常指標作為引用的內部實現,因此引用所占用的空間大小與指標相同 從使用的角度,引用會讓人覺得只是乙個別名,其實有自己的儲存空間。這是c 為了實用性而做出...
C Primer 筆記 指標和引用的區
區別 1.引用總是指向某個物件 定義引用時必須初始化。2.對引用的修改實際是對其關聯的物件進行修改。如下兩個程式段 int ival 1024,ival2 2048 int pi ival,pi2 ival2 pi pi2 pi now point to ival2賦值結束後,原pi所指的ival物...
指標引用和引用指標的區別
c 在傳參的過程中,指標 和指標引用 是有區別的。雖然,我們往往可以通過傳指標然後通過間址訪問來修改指標所指向物件的值,同樣,通過引用也可以直接修改物件的值。但是,當傳指標的時候有乙個問題,就是,我們雖然可以通過指標來修改指標所指向物件的值,但是我們沒有不能直接修改指標的內容 也就是指標變數存放的位...