全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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小时内与您取得联系。