const int a = 1;
int *p = (int *)&a;
*p = 5;
printf("%d",a) //输出1 但a所指内存被修改为5
a为真正意义上的常量,在编译期间已经在符号表中被替换为1,可执行程序不知道符号表的存在,无论怎样用指针修改a的内存,a始终为1
若改为:const int &a = 1; 打印出a=5,a为只读变量
int &a = 1 写法错误,右边必须为变量或加const
const int a = 1;
int &b =a; //语法错误,a已经在编译时被替换为1,int &b = 1当然错误
引用有更好的可读性和实用性
swap(int &a, int &b)
{
int temp = a; a= b; b= temp;
} //调用 swap(a, b)
swap(int *a, int *b)
{
int temp = *a; *a = *b; *b = temp;
} //调用 swap(&a, &b)
当使用常量对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名
int &a = 1;
引用也有自己的存储空间 ,即指针,32位中占4字节
int &a == int *const //C++内部就是这样实现引用的
当函数返回值为引用时
若返回栈变量
• 不能成为其它引用的初始值
• 不能作为左值使用
若返回静态变量或全局变量
• 可以成为其他引用的初始值
• 即可作为右值使用,也可作为左值使用
int &fun()
{
int a =1; return a;
} //调用时,不能 int b = fun() (函数返回时a地址已经回收) ,若函数改为static int a =1; 则可以