C++中指针和引⽤就像两个性格迥异的亲兄弟,指针是哥哥,引⽤是弟弟,在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代。
• 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
示例代码:
int main()
{
int a = 0;
int* p = &a;//取地址
*p = 1;//解引用赋值
int& ra = a;//引用,取别名
ra = 2;
return 0;
}
表层解释:
如果我们看看底层的汇编语言呢?
(mov)把 "," 右边的值move到左边;
(l e a)取 "," 右边的地址,放到左边eax(寄存器);
所以:其实引用的本质还是指针,不过我们最好以表层来将他们区分开来。
• 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
示例代码:
int main()
{
int& a = 1;//不可行,会报错
//error C2440: “初始化”: 无法从“int”转换为“int &”
int* pa = 100;//C语言可以,C++会报错,所以,尽量初始化
return 0;
}
• 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
示例代码:
int main()
{
int a = 0;
int& ra = a;
ra = b;//error C2065: “b”: 未声明的标识符
//上面这相当于赋值,不能再引⽤其他对象
return 0;
}
• 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
• sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte)
• 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些。
#include<iostream>
//由于栈的销毁,会出现类似野指针
//野引用
int& func()
{
int a = 0;
return a;//返回他的引用
}
//间接的空引用
int main()
{
int* ptr = NULL;
int& rb = *ptr;
rb++;
return 0;
}
文章短短,其实是对C++入门(点这里哈)的引用知识的补充~~~