# include <iostream>
using namespace std;
int main()
{
int a = 500;
// *(int *)0xb0001234 = 500;
int& ra = a; //ra是a的引用
printf("sizeof(a) = %d, sizeof(ra)=%d\n", sizeof(a), sizeof(ra));//所占空间大小一样
printf("&a = %p &ra = %p \n, &a, &ra);//所占内存中的位置一样
}
- 一种声明关系,声明的时候必须要初始化。引用不开辟空间。
int &ra; //[ERROR]
- 此种声明关系,一经声明,不可变更。
- 可以对引用再次引用,多次引用的结果就是多个引用指向同一个变量。
- &符号前有数据类型时,是引用。其他均为取地址。
最简易的交换值的代码:
void swap(int *pa, int *pb)
{
*pa ^= *pb;
*pb ^= *pa;
*pa ^= *pb;
}
void swap(int &ra, int &rb)
{
ra ^= rb;
rb ^= ra;
ra ^= rb;
}//本段代码没有开辟新的空间
引用的本质是对指针的再次包装。指针是由引用的,但是不可以对引用取地址(不可以有引用的指针)。
#include <iostream>
using namespace std;
//void swap(char** p, char** q)//通过向上一级的方式来交换信息,但是这么做不是很好
//{
// cout<<p<<" "<<q<<endl;
// char *t = *q;
// *q = *p;
// *p = t;
//}
void swap(char* &p, char* &q)//同级的交换,指针的引用
//(平级内解决问题,并且不开辟多余空间)
{
cout<<p<<" "<<q<<endl;
char* t = q;
q = p;
p = t;
}
int main()
{
char *p = "difficult";
char *q = "hope";
cout<<"p = "<<p<<" q = "<<q<<endl;
cout<<"p's address is "<<&p<<endl;
// swap(&p, &q);
swap(p, q);
cout<<"p = "<<p<<" q = "<<q<<endl;
return 0;
}
引用的提高
1. 可以定义指针的引用,但不能定义引用的引用
//[CORRECT]
int * p;
int * & rp = p;
int ** pp = &p;
//[ERROR]
int a;
int &ra = a;
int & & rra = ra;
//引用希望能在零级内解决问题,从而消除指针的使用
2. 可以定义指针的指针(二级指针),但是不能定义引用的指针
int * & -> 指针的引用,合法
int & * -> 引用的指针,不合法
3. 可以定义指针数组,不能定义引用数组,可以定义数组引用
int x, y, z;
int * p[] = {&x, &y, &z}; //[CORRECT]
int & rp[]={x, y, z}; //[ERROR]rp一般代表首元素的地址, rp代表引用的地址 int & *
int arr[]={1, 2, 3, 4, 5}; //指针的引用 int[5] &
int(&rarr)[5] = arr;
常引用
const的引用类型也为const
const引用可以使用相关类型的对象(常量,非同类型变量或表达式)初始化。
use const whenever it’s possible
int a = 200;
const double & rd = a; //[CORRECT]类型不匹配,则产生一个中间变量
// double tmp = a; const double & rd = tmp;