引用的基本概念
變量名實質上是一段連續存儲空間的別名,例如房間的門牌號,程序通過變量來申請並命名內存空並使用存儲空間
引用可以看作一個已定義變量的別名
引用的語法:
type &name = var
int b=10;
int &a=b;
引用的使用:
void main1()
{
int a = 2018;
int &b = a;
b = 2019;
printf("b:%d\n",b);
printf("a:%d\n", a);
printf("&a:%d\n",&a);
printf("&b:%d\n",&b);
}
//程序輸出:
b:2019
a:2019
&a:6422296
&b:6422296
由程序輸出可見:b是a的引用,更新b也同時更新了a的值,因爲a,b均指向統一內存空間。
引用的本質
因爲引用必須要初始化,故引用類似於一個const
int &a=b;<=====>int * const a=&b;
即引用在C++中的內部實現是一個常指針,故引用佔據的內存空間大小與指針相同:4字節
故雖然引用是別名,但是仍然有自己的存儲空間
====>因此在編譯的時候,編譯器自動幫助我們對實際參數b取地址傳給了常量指針a-即形參引用
引用的使用
引用做左值
當函數返回值爲引用時
若返回棧變量
不能成爲其它引用的初始值
不能作爲左值使用
若返回靜態變量或全局變量
可以成爲其他引用的初始值
即可作爲右值使用,也可作爲左值使用
返回值是static做引用-代碼實例:
int test1()
{
static int a = 10;
a ++;
printf("a:%d \n", a);
return a;
}
int& test2()
{
static int a = 10;
a ++;
printf("a:%d \n", a);
return a;
}
int *test3()
{
static int a = 10;
a ++;
printf("a:%d \n", a);
return &a;
}
int main()
{
// test1()的運算結果是一個數值,沒有內存地址,不能當左值
//當被調用的函數當左值的時候,必須返回一個引用
test2() = 100; //編譯器實現做左值條件
test2();
*(test3()) = 200; //自己實現做左值的條件
test3();
return 0;
}
程序結果:
a:11
a:101
a:11
a:201
返回值是形式參數做引用-代碼實例:
int& test(int *p)
{
*p = 100;
return *p;
}
int main()
{
int a=10;
//使用引用去接收函數的返回值,看返回的內存空間是否被編譯器釋放
//這裏:a的地址與test(&a)的地址時一樣的,故還沒有釋放,可以做引用的右值
int &b=test(&a);
return 0;
}
返回值是其他複雜類型做引用:========>以後更新
指針的引用-代碼示例:
struct Teacher
{
char name[64];
int age;
};
int getTe(Teacher **myp )
{
Teacher *p=NULL;
p = (Teacher *)malloc(sizeof(Teacher));
if (p ==NULL)
{
return -1;
}
p->age = 33;
*myp = p;
return 0;
}
int main()
{
Teacher *p1 = NULL;
getTe(&p1);
printf("age:%d \n", p1->age);
return 0;
}
以上函數的內存執行圖:
指針引用:
int getTe2(Teacher* &myp)
{
myp = (Teacher *)malloc(sizeof(Teacher));
myp->age = 34;
return 0;
}
常引用-代碼示例:讓變量引用具有隻讀屬性
//普通引用
int a = 10;
int &b = a;
//常量引用 :讓變量引用只讀屬性
const int &c = a;
//常量引用初始化 分爲兩種
//1 用變量 初始化 常量引用
int x = 20;
const int& y = x;
//2 用常量 初始化 常量引用
//int &m = 10; //引用是內存空間的別名 字面量10沒有內存空間 沒有方法做引用
const int &m = 10;
常引用總結:
1)Const & int e 相當於 const int * const e
2)普通引用 相當於 int *const e1
3)當使用常量(字面量)對const引用進行初始化時,C++編譯器會爲常量值分配空間,並將引用名作爲這段空間的別名
4)使用字面量對const引用初始化後,將生成一個只讀變量