Reference & 引用
变量名,本身是一段内存的引用,即别名(alias)。此处引入的引用,是为己有变
量起一个别名。
int a= 500; //变量名.实质是一段内存空间的别名
(int)0x0002345=500;
引用的规则
- 引用,是一种关系型声明,而非定义。
不能独立存在,必须初始化,且与原类型保持一致,且不分配内存。- 声明关系,一经声明,不可变更。
- 可对引用,再次引用。多次引用的结果,
是某一变量具有多个别名,多个别名间是平行关系。- 辨别引用与其它,&符号前有数据类型时,
是引用,其它皆为取地址或按位与。
#include <iostream>
using namespace std;
int main()
{
int a,b;
int &ra = a; //声明引用变量 ra,并初始化为 a 变量的引用
// int &ra = b; //错误,不可更改原有的引用关系
// float &rb = b; //错误,引用类型不匹配
cout<< sizeof(a)<<" "<< sizeof(ra)<<endl; // 4 4
cout<<&a<<" "<<&ra<<endl; //变量与引用具有相同的地址。//0x62fe0c 0x62fe0c
a=100;
cout<<a<<" "<<ra<<endl;//100 100
ra=200;
cout<<a<<" "<<ra<<endl;//200 200
int &rra = ra; //可对引用再次引用,但是不能建立引用的引用 (int & &rra = ra; 是错误的)
// 表示 a 变量有两个别名,分别是 rra 和 ra
cout<<a<<" "<<ra<<" "<<rra<<endl;//200 200 200
cout<<&a<<" "<<&ra<<" "<<&rra<<endl; //变量与引用具有相同的地址。//0x62fe0c 0x62fe0c 0x62fe0c
int *p = &ra; //可以对引用取地址,但是不能建立引用的指针 (int & *p=&ra; 是错误的) 引用的本质是对指针的包装,再对其解包没有意义
cout<<p<<" "<<&ra<<" "<<&rra<<endl; //0x62fe04 0x62fe04 0x62fe04
return 0;
}
引用的应用
交换数据:
#include <iostream>
using namespace std;
void swap(int &a, int &b){
a^=b;
b^=a;
a^=b;
}
int main()
{
int a=5, b=10;
cout<<"交换前: a="<<a<<" b="<<b<<endl;
swap(a, b);
cout<<"交换后: a="<<a<<" b="<<b<<endl;
return 0;
}
交换前: a=5 b=10
交换后: a=10 b=5
交换指针:
#include <iostream>
using namespace std;
//交换指针 引用的本质是对指针的再次包装 ; 指针是有引用的 ; 不应该有引用的指针
void swap(char* &p, char* &q){
char* temp=p;
p=q;
q=temp;
}
int main()
{
char* pchar="hello";
char* qchar="world";
cout<<"交换前: pchar="<<pchar<<" qchar="<<qchar<<endl;
swap(pchar, qchar);
cout<<"交换后: pchar="<<pchar<<" qchar="<<qchar<<endl;
return 0;
}
交换前: pchar=hello qchar=world
交换后: pchar=world qchar=hello
深入使用引用
引用的本质是指针,C++对裸露的内存地址(指针)作了一次包装。又取得的指针的优良特
性。所以再对引用取地址,建立引用的指针没有意义。
- 可以定义指针的引用,但不能定义引用的引用。
int a;
int* p = &a;
int*& rp = p; // ok
int& r = a;
int&