全网整合营销服务商

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

免费咨询热线: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++引用的详细解释  # 的是  # 事实上  # 只不过  # 就得  # 不为  # 再看  # 实质上  # 是一个  # 也不  # 是因为  # 就不  # 是指  # 回事  # 希望能  # 要想  # 可以实现  # 影响到  # 即是  # 怎么回事  # 谢谢大家 


相关文章: 西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  小型网站制作HTML,*游戏网站怎么搭建?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  制作网站公司那家好,网络公司是做什么的?  太原网站制作公司有哪些,网约车营运证查询官网?  个人摄影网站制作流程,摄影爱好者都去什么网站?  制作网站怎么制作,*游戏网站怎么搭建?  北京网站制作公司哪家好一点,北京租房网站有哪些?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  C#怎么使用委托和事件 C# delegate与event编程方法  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  如何快速上传自定义模板至建站之星?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  装修招标网站设计制作流程,装修招标流程?  如何快速辨别茅台真假?关键步骤解析  公司网站制作价格怎么算,公司办个官网需要多少钱?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  如何快速生成高效建站系统源代码?  网站企业制作流程,用什么语言做企业网站比较好?  网站制作价目表怎么做,珍爱网婚介费用多少?  如何通过商城自助建站源码实现零基础高效建站?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  如何配置IIS站点权限与局域网访问?  如何选择可靠的免备案建站服务器?  如何高效配置香港服务器实现快速建站?  Python如何创建带属性的XML节点  大同网页,大同瑞慈医院官网?  广东企业建站网站优化与SEO营销核心策略指南  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  免费视频制作网站,更新又快又好的免费电影网站?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  ,怎么在广州志愿者网站注册?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何在Golang中指定模块版本_使用go.mod控制版本号  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  代刷网站制作软件,别人代刷火车票靠谱吗?  如何通过虚拟机搭建网站?详细步骤解析  高端网站建设与定制开发一站式解决方案 中企动力  建站主机选虚拟主机还是云服务器更好?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  如何确认建站备案号应放置的具体位置?  如何在宝塔面板创建新站点?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  如何在阿里云通过域名搭建网站?  建站为何优先选择香港服务器?  Android自定义控件实现温度旋转按钮效果 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。