C++中指针和引用的区别

指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法。
1.指针和引用的定义和性质区别:
(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:
int a=1;int *p=&a; int a=1;int &b=a;
上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。
而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。
(2)可以有const指针,但是没有const引用;
(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
(7)指针和引用的自增(++)运算意义不一样;
2.指针和引用作为函数参数进行传递时的区别。
(1)指针作为参数进行传递:
#include<iostream>
using namespace std;
void swap(int *a,int *b)
{
int temp=*a;
*a=*b;
*b=temp;
}
int main(void)
{
int a=1,b=2;
swap(&a,&b);
cout<<a<<" "<<b<<endl;
system("pause");
return 0;
}
结果为2 1;
用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址,因此使用*a实际上是取存储实参的内存单元里的数据,即是对实参进行改变,因此可以达到目的。
再看一个程序;
#include<iostream>
using namespace std;
void test(int *p)
{
int a=1;
p=&a;
cout<<p<<" "<<*p<<endl;
}
int main(void)
{
int *p=NULL;
test(p);
if(p==NULL)
cout<<"指针p为NULL"<<endl;
system("pause");
return 0;
}
运行结果为:
0x22ff44 1
指针p为NULL
大家可能会感到奇怪,怎么回事,不是传递的是地址么,怎么p回事NULL?事实上,在main函数中声明了一个指针p,并赋值为NULL,当调用test函数时,事实上传递的也是地址,只不过传递的是指地址。也就是说将指针作为参数进行传递时,事实上也是值传递,只不过传递的是地址。当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参,即上面程序main函数中的p何test函数中使用的p不是同一个变量,存储2个变量p的单元也不相同(只是2个p指向同一个存储单元),那么在test函数中对p进行修改,并不会影响到main函数中的p的值。
如果要想达到也同时修改的目的的话,就得使用引用了。
2.将引用作为函数的参数进行传递。
在讲引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝,因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可以节约空间。
看下面这个程序:
#include<iostream>
using namespace std;
void test(int &a)
{
cout<<&a<<" "<<a<<endl;
}
int main(void)
{
int a=1;
cout<<&a<<" "<<a<<endl;
test(a);
system("pause");
return 0;
}
输出结果为: 0x22ff44 1
0x22ff44 1
再看下这个程序:
这足以说明用引用进行参数传递时,事实上传递的是实参本身,而不是拷贝。
所以在上述要达到同时修改指针的目的的话,就得使用引用了。
#include<iostream>
using namespace std;
void test(int *&p)
{
int a=1;
p=&a;
cout<<p<<" "<<*p<<endl;
}
int main(void)
{
int *p=NULL;
test(p);
if(p!=NULL)
cout<<"指针p不为NULL"<<endl;
system("pause");
return 0;
}
输出结果为:0x22ff44 1
指针p不为NULL
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# C++中指针和引用的区别
# C++指针与引用
# C++中指针和引用详解
# 详解C++数组和数组名问题(指针、解引用)
# C++指针与引用的区别案例详解
# 实例详解C++中指针与引用的区别
# 详解C++ 引用
# C++引用的详细解释
# 的是
# 事实上
# 只不过
# 就得
# 不为
# 再看
# 实质上
# 是一个
# 也不
# 是因为
# 就不
# 是指
# 回事
# 希望能
# 要想
# 可以实现
# 影响到
# 即是
# 怎么回事
# 谢谢大家
相关文章:
网站按钮制作软件,如何实现网页中按钮的自动点击?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
如何快速选择适合个人网站的云服务器配置?
如何用搬瓦工VPS快速搭建个人网站?
如何用虚拟主机快速搭建网站?详细步骤解析
打鱼网站制作软件,波克捕鱼官方号怎么注册?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
利用JavaScript实现拖拽改变元素大小
专业网站建设制作报价,网页设计制作要考什么证?
如何选择最佳自助建站系统?快速指南解析优劣
如何通过VPS搭建网站快速盈利?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
孙琪峥织梦建站教程如何优化数据库安全?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
安云自助建站系统如何快速提升SEO排名?
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
如何快速启动建站代理加盟业务?
江苏网站制作公司有哪些,江苏书法考级官方网站?
济南企业网站制作公司,济南社保单位网上缴费步骤?
如何获取免费开源的自助建站系统源码?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
网站app免费制作软件,能免费看各大网站视频的手机app?
网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?
南京网站制作费用,南京远驱官方网站?
魔方云NAT建站如何实现端口转发?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
建站之星后台密码如何安全设置与找回?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
长沙做网站要多少钱,长沙国安网络怎么样?
linux top下的 minerd 木马清除方法
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何彻底卸载建站之星软件?
如何在云主机快速搭建网站站点?
详解jQuery中基本的动画方法
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
免费网站制作appp,免费制作app哪个平台好?
广州商城建站系统开发成本与周期如何控制?
深圳网站制作培训,深圳哪些招聘网站比较好?
油猴 教程,油猴搜脚本为什么会网页无法显示?
如何高效完成自助建站业务培训?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
微信推文制作网站有哪些,怎么做微信推文,急?
高防服务器:AI智能防御DDoS攻击与数据安全保障
如何基于云服务器快速搭建网站及云盘系统?
如何选择PHP开源工具快速搭建网站?
建站主机是什么?如何选择适合的建站主机?
济南专业网站制作公司,济南信息工程学校怎么样?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。