引用(&)的特点:
(1) 必须初始化 int &a = b; //将b的地址存放在开辟的内存中
(2) 初始化的值必须可以取地址 int &a = 10; //error
(3) 引用一经定义不能改变 int &a=b; &a=c; //error
(4) 访问引用变量,永远访问的是它所引用的内存
const和引用的结合:
(1)对变量的引用,可以用普通引用,也可以常引用。
例:int a = 10;
int &b = a;
const int &c = a; //常引用可以引用变量,也可以引用常量(即:int a; const int a;)
(2)对常量的引用,又分为两种:
a、可寻址的常量;
b、不可寻址的常量;
对可寻址的常量的引用,例:const int a = 10;
const int &p = a;
对不可寻址的常量的引用,例:const int &p = 10; //正确 (虽然10不可寻址,但可常引用,因为产生了临时量,如下:)
const int &p = 10;————> const int temp = 10;
const int &p = temp;
例:在内存0x0018ff44上写一个4字节的整数10?
指针变量: int *p = (int*)0x0018ff44;
*p = 10;
指针的引用变量:int *const &p = (int*)0x0018ff44; //不可寻址,故采用常引用,也产生临时量
*p = 10; 临时量: int *const temp = (int*)0x0018ff44;
int *const &p = temp;
const和指针的结合:
有三种结合方式:
a、const int *p //const修饰*p *p不能改变,p的指向可以改变
b、int const *p //const修饰*p *p不能改变,p的指向可以改变
c、int *const p //const修饰p p的指向不能改变,*p可以改变
例1:
const int a = 10;
int *p = &a; //error a的类型为const int* p的类型为int* const int* ——> int* 错误 应改为 const int *p = &a;
*p = 20;
例2:
int a = 10;
const int *p = &a; //ok a的类型为int* p的类型为const int* 因为a本身可被修改,即使赋值给*p,*p不可被修改,故正确。 int*——>const int* 正确
int *q = p; //error p的类型为const int* q的类型为int* 故错误。 应改为const int *q = p;