C++的引用和指针的区别(&和*)

本文对比了C++中指针和引用的特点与用法。指针可以指向未初始化的内存空间,而引用作为对象的别名,无法指向未初始化的对象。文章通过实例展示了指针在使用前需要检查有效性,而引用则不需要。

这里,做个总结。
资料来源:https://www.zhihu.com/question/37608201
More Effective C++
先来说一下指针的特点:
1.指针的本意是可以指向一块地址空间,这就意味着指针可以指向未初始化的内存空间。
2.这里我们来了解一下const在指针上的用法,我们这里要理解两个const,指向常量的指针以及常量指针,指向常量的指针说明我们不能通过这个指针去修改这个常量。之后,我们再讨论一下常量指针,常量指针的意思就是我们只能指向一块特定的内存,但是不能改变。
3.在没有指定该指针为常量指针的时候,我们可以随意改变该指针指向的内存。
知道了指针的这些特点,我们就可以很快的理解引用有哪些不同。
引用的意思更像是一个对象的别名,是指代这个对象的一个名字。
1.既然是一个别名,那自然是无法给一个未初始化的对象起别名的啦,这就带来一个好处,在我们在使用引用的时候。不用判断这个引用是否初始化(指针必须判断),省下了一个功夫。
看下知乎上的一个例子:
void fun1(int *point)
{
// 为了代码的稳健和安全,我们需要判断指针是否有效,通常做法是判断指针是否为
// 空,其他的判断就需要根据函数的具体功能来判断了
if(!point)
{
return;
}
// 函数实现
}

void fun2(int &refence)
{
// 在这里,我们就不用担心refence是否为空
}

作者:牛开放
链接:https://www.zhihu.com/question/37608201/answer/90293843
来源:知乎
2.引用类似于一个常量指针,当指定了一个对象的引用,就不能把这个引用改变成其他对象的引用了。具体还是看下知乎上的例子:
int xiaoming = 1;
int &refence_mingming = xiaoming;
int xiaoan = 2;
refence_mingming = xiaoan; // error,引用不能换了

这里提一句哈,引用的内部也是借助指针来实现的,但是应该在外面还包裹了其他信息。所以,引用的占用内存应该是会比指针大的,但是肯定是比把整个对象当做参数的代价要低。

### C语言C++指针及`&`符号的用法及其差异 #### 一、基础概念对比 在C语言C++编程环境中,`&`符号有着不同的语义背景。于C语言而言,此符号主要用于取地址操作,即通过该运算符可以获取变量存储位置的地址[^3]。 而在C++里,除了保持原有的取址功能外,`&`还引入了一种新的特性——引用(reference)[^1]。当定义函数形参或者声明对象时使用`&`作为修饰词,则表示创建了一个原实体的别名而非副本,这使得可以直接修改原始数据而无需借助解引用操作[^2]。 #### 二、具体应用场景分析 对于仅熟悉C语言的学习者来说,在面对诸如交换两个整数这样的需求时,通常采用传递指向这些数值的指针方式来间接改变它们的内容: ```c void swap(int *a, int *b){ int temp=*a; *a=*b; *b=temp; } ``` 然而到了C++环境下,利用引用机制能够更加简洁直观地完成相同任务,并且减少了可能出现的风险(比如空指针异常等问题),因为引用必须初始化并始终关联有效内存区域内的某个特定实例: ```cpp void swap(int &a,int &b){ int temp=a; a=b; b=temp; } ``` 值得注意的是,虽然表面上看两者实现了几乎一致的功能,但从内部工作原理上看,许多时候编译器会把对引用的操作转换成相应的指针形式来进行处理,因此二者之间存在着密切联系的同时也具备各自特点。 #### 三、潜在风险提示 不恰当运用指针可能导致程序崩溃或产生难以定位的问题,例如未初始化就使用的指针、悬空指针等情形均属于常见陷阱之一;相对之下,由于引用本质上就是已绑定到固定目标上的别名,所以在安全性方面表现得更为可靠一些,但这并不意味着完全排除了所有可能性错误的发生概率[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值