c++中的引用
變量名的回顧:
變量實際是一片連續存儲空間的別名,而引用呢?引用可以看做已經定義變量的別名;
引用的語法type & name = var;
int a = 4;
int &b = a; //b為a的別名,
b = 5; //操作b就是操作a
注意:普通引用在定義時必須用同類型的變量進行初始化
如果初始化的時候,不是同類型,則會報警告,不是變量也會報錯誤;不初01始化也會報錯誤;
實例程序1:
#include<stdio.h>
int main(void)
{
int a = 3;
int &b = a;
b = 5;
printf("%d \n, a"); // 5
printf("%d \n", b); //5
printf("%p \n", &a); //
pintf("%p \n", &b);
return 0;
}
三目運算符
C++對於三目運算做了升級,如果表達式都是變量,則返回引用;引用可以做左值;如果表達式有常量,則返回常量;
引用的本質:
引用是變量的別名,實質上是一個常量指針(在編譯器內部是這樣實現的);
形式:Type & name; -> Type* const name;
因為它的實質是指針,所以引用占的內存空間是4個字節(32位系統);引用作為變量的別名,在很多時候可以代替指針,所以提高了安全性,但是要注意:
一: 函數返回局部引用,這是無效的;因為引用本質為指針,返回局部引用,函數調用結束后,棧是自動銷毀的;所以返回無效;
實例代碼:
#include<stdio.h> int& demo() { int d = 0; printf("demo: d = %d\n", d); return d; //return &d; } int& fun() { static int s = 0; printf("fun: s = %d\n", s); return s;//return &s; } int main(int argc, char **argv) { int& rd = demo();//隨機值
int& rs = fun(); printf("\n");
printf("main: rd = %d\n", rd); //隨機值
printf("main: rs = %d\n", rs);
printf("\n");
rd = 10;
rs = 11;
demo();
fun();
printf("\n");
printf("main: rd = %d\n", rd);//隨機值
printf("main: rs = %d\n", rs);
printf("\n");
return 0;
}
二:特殊的引用: 引用可以用變量進行初始化;有一種引用可以用常量進行初始化,const引用,這就是一種特殊引用;當使用常量對const引用進行初始化時,C++編譯器會為常量值分配空間,並將引用名作為這段空間的別名;
1 #include<stdio.h> 2 3 int Example(void) 4 { 5 printf("Example\n"); 6 int a = 4; 7 const int& b = a; 8 int *p = (int*)&b; 9 // b = 5; //error; readonly variable; 10 *p = 5; 11 printf("a = %d, b = %d\n", a, b); 12 13 } 14 15 int Demo(void) 16 { 17 printf("Demo\n"); 18 int a = 4; 19 const int& b = 3; 20 printf("1:a = %d, b = %d\n", a, b); 21 int *p = (int*)&b; 22 // b = 5; 23 *p = 5; 24 printf("2:a = %d, b = %d\n", a, b); 25 26 } 27 int Exp(void) 28 { 29 bool ret = true; 30 struct TRef 31 { 32 char& a; 33 }; 34 char m = 5; 35 char&ma = m; 36 TRef ref = {ma}; 37 38 printf("sizeof(TRef) = %d\n",sizeof(TRef)); 39 printf("sizeof(ma) = %d\n",sizeof(ma)); 40 41 printf("sizeof(char&) = %d\n",sizeof(char&)); 42 printf("sizeof(ref.a) = %d\n",sizeof(ref.a)); 43 return ret; 44 } 45 int main(int argc, char **argv) 46 { 47 Example(); 48 Demo(); 49 Exp(); 50 return 0; 51 } 52 53 #if 0 54 55 Type& name; -> Type* const name; 56 57 ______________________________________________________ 58 | void f(int &a) | void f(int* const a) | 59 | { | { | 60 | a = 5; | *a = 5; | 61 | } | } | 62 |______________________|_____________________________| 63 64 #endif
