定义:引用就是已经定义的变量的别名。
语法:Type& name = var;
eg: int a = 0; int& b = a; // b 就是 a 的别名 b = 5; // 操作 b 就是操作 a
引用在定义的时候必须用同一种类型进行初始化,a,b类型相同。
含义:在C++中可以对同一段内存起不同的名字。
1. 引用代替指针
void swap( int& a , int& b ) //同一变量的地址 { int temp = a; a = b; b = temp; } void swap(int *a,int* b) { int temp = *a; *a = *b; *b = temp; } int main(void) { int a=1,b=2; swap(a,b); return 0; }
2. const引用
语法:const Type& name = var;
含义:const引用让变量拥有只读属性。
int a = 4; const int& b = a; b = 5; // error
注:引用中不可以用常量来初始化。const引用可以。
int& a = 1; //error const int& a = 1; //此时编译器会创建只读常量,内存创建四个字节地址,用b作为其别名。本质还是变量
int *p = (int *)&a; // 用p将只读变量a转化为普通变量
*p = 5 ; // ok a==5
const引用的类型与初始化变量的类型
a. 相同时:初始化变量为只读变量
b. 不同时:创建一个新的只读变量
char c = 'c'; // c是常量
char& rc = c; // rc是只读变量
const int& trc = c; // trc是新的只读变量,初始化类型与const引用类型不同,新的内存地址
rc = 'a';
printf("c = %c
", c); // a
printf("rc = %c
", rc); // a
printf("trc = %c
", trc); // c
3.引用在C++内部的实现是指针常量
指针常量规定了指针指向的地址不可变。使用时引用 a 相当是 *a。
Type& name; <==> Type* const name;
void fun(int& a) { a = 5;} //等价 void fun(int* const a) {*a = 5;}
4. 指针与引用的区别
1. 引用在创建时必须初始化,以后不可以代表其他变量(c语言中指针可以指向其他变量)。
2. const引用使其变量拥有只读属性(C语言指针可以被const修饰为只读变量或者常量)。
3. 所有对引用的操作可以直接作用于代表的变量(c语言中解指针才是)。
#include <stdio.h> int a = 1; struct SV { int& x; int& y; int& z; }; int main() { int b = 2; int* pc = new int(3); SV sv = {a, b, *pc}; // 结构体成员全部为引用,成员地址空间不连续。 int& array[] = {a, b, *pc}; // error 数组成员全部为引用 ,成员地址空间不连续,与C语言数组空间连续冲突,C++不支持引用数组。 // 在C++编译器的角度引用是别名,直接代表变量。在C编译器的角度中指针常量是一个常量。 printf("&sv.x = %p ", &sv.x); // 成员地址在静态存储区 printf("&sv.y = %p ", &sv.y); // 成员地址在栈区 printf("&sv.z = %p ", &sv.z); // 成员地址在堆区 delete pc; return 0; }