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

网上有关“C++中引用与指针的区别”话题很是火热,小编也是针对C++中引用与指针的区别寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。

C++中指针与引用的区别:

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

指针和引用的区别如下:

1、引用不可以为空,但指针可以为空。

2、引用不可以改变指向,对一个对象"至死不渝";但是指针可以改变指向,而指向其它对象。

3、引用的大小是所指向的变量的大小,因为引用只是一个别名而已;指针是指针本身的大小,4个字节。

4、引用比指针使用起来形式上更漂亮,使用引用指向的内容时可以之间用引用变量名,而不像指针一样要使用*;定义引用的时候也不用像指针一样使用&取址。

5、引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。

const指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)。

总而言之,言而总之——它们的这些差别都可以归结为"指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。

本质JAVA中的引用和C中的指针本质上都是想通过一个别名,找到要操作的目标(变量对象等),方便在程序里操作。所不同的是JAVA的办法更安全,使用更加方便些,但没有了C的灵活,高效。

指针是实实在在的变量,有自己的内存存储空间,它可以指向任何有效的变量。引用是一种形式、方法,定义的引用变量,实际上是原实际变量的另一个名称(别名),引用变量本身没有自己的实际存储空间,操作引用变量,就是在操作实际变量。

关于“C++中引用与指针的区别”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

本文来自作者[甫凌熙]投稿,不代表天华号立场,如若转载,请注明出处:https://thwy.com.cn/th/8374.html

(10)

文章推荐

  • 实测分析“微乐小程序有挂吗”其实确实有挂

    您好:微乐小程序有挂吗这款游戏是可以开挂的,软件加微信【添加图中QQ群】确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且好像能看到其他人的牌一样。所以很多小伙伴就怀疑这款游戏是不是有挂,实际上这款游戏确实是有挂的,添加客服微信【添加图中QQ群】安装软件.1.微

    2025年08月14日
    51
  • 安装程序教程“麻将机万能遥控怎么用”(其实确实有挂)

    普通麻将机免安装控牌器,这一现代麻将游戏的必备神器,如今已逐渐取代了传统的手搓麻将。在大家聚在一起享受麻将时光的同时,是否曾想过,这看似普通的麻将机,其实也可能隐藏着某些不为人知的秘密?今天,就让我们一起揭开麻将机背后的那些猫腻

    2025年12月11日
    7
  • 7分钟科普“十三水最新感应分析仪”(怎么设置胜率)

    普通麻将机免安装控牌器,这一现代麻将游戏的必备神器,如今已逐渐取代了传统的手搓麻将。在大家聚在一起享受麻将时光的同时,是否曾想过,这看似普通的麻将机,其实也可能隐藏着某些不为人知的秘密?今天,就让我们一起揭开麻将机背后的那些猫腻

    2025年12月11日
    9
  • 7分钟揭秘!扑克牌金花辅助器可试用”(其实真的确实有挂)

    普通麻将机免安装控牌器,这一现代麻将游戏的必备神器,如今已逐渐取代了传统的手搓麻将。在大家聚在一起享受麻将时光的同时,是否曾想过,这看似普通的麻将机,其实也可能隐藏着某些不为人知的秘密?今天,就让我们一起揭开麻将机背后的那些猫腻

    2025年12月12日
    8
  • 9分钟科普“扑克牌九点洗牌教学(确实真的有挂)

    普通麻将机免安装控牌器,这一现代麻将游戏的必备神器,如今已逐渐取代了传统的手搓麻将。在大家聚在一起享受麻将时光的同时,是否曾想过,这看似普通的麻将机,其实也可能隐藏着某些不为人知的秘密?今天,就让我们一起揭开麻将机背后的那些猫腻

    2025年12月12日
    9
  • 1分钟科普“新一代麻将作弊工具(怎么设置系统给你好牌)

    普通麻将机免安装控牌器,这一现代麻将游戏的必备神器,如今已逐渐取代了传统的手搓麻将。在大家聚在一起享受麻将时光的同时,是否曾想过,这看似普通的麻将机,其实也可能隐藏着某些不为人知的秘密?今天,就让我们一起揭开麻将机背后的那些猫腻

    2025年12月16日
    8
  • 8分钟科普“普通自动麻将机打牌有规律吗”(其实真的确实有挂)

    普通麻将机免安装控牌器,这一现代麻将游戏的必备神器,如今已逐渐取代了传统的手搓麻将。在大家聚在一起享受麻将时光的同时,是否曾想过,这看似普通的麻将机,其实也可能隐藏着某些不为人知的秘密?今天,就让我们一起揭开麻将机背后的那些猫腻

    2025年12月18日
    9
  • 7分钟揭秘!麻将机随意控牌器新款”(专用神器)

    普通麻将机免安装控牌器,这一现代麻将游戏的必备神器,如今已逐渐取代了传统的手搓麻将。在大家聚在一起享受麻将时光的同时,是否曾想过,这看似普通的麻将机,其实也可能隐藏着某些不为人知的秘密?今天,就让我们一起揭开麻将机背后的那些猫腻

    2025年12月21日
    8
  • 玩家必看教程“金花扑克感应辅助器”(助赢神器)

    普通麻将机免安装控牌器,这一现代麻将游戏的必备神器,如今已逐渐取代了传统的手搓麻将。在大家聚在一起享受麻将时光的同时,是否曾想过,这看似普通的麻将机,其实也可能隐藏着某些不为人知的秘密?今天,就让我们一起揭开麻将机背后的那些猫腻

    2025年12月21日
    8
  • 3分钟学会“九点扑克洗牌技巧(助手神器外辅工具)

    普通麻将机免安装控牌器,这一现代麻将游戏的必备神器,如今已逐渐取代了传统的手搓麻将。在大家聚在一起享受麻将时光的同时,是否曾想过,这看似普通的麻将机,其实也可能隐藏着某些不为人知的秘密?今天,就让我们一起揭开麻将机背后的那些猫腻

    2025年12月25日
    4

发表回复

本站作者后才能评论

评论列表(4条)

  • 甫凌熙
    甫凌熙 2025年12月26日

    我是天华号的签约作者“甫凌熙”!

  • 甫凌熙
    甫凌熙 2025年12月26日

    希望本篇文章《C++中引用与指针的区别》能对你有所帮助!

  • 甫凌熙
    甫凌熙 2025年12月26日

    本站[天华号]内容主要涵盖:生活百科,小常识,生活小窍门,知识分享

  • 甫凌熙
    甫凌熙 2025年12月26日

    本文概览:网上有关“C++中引用与指针的区别”话题很是火热,小编也是针对C++中引用与指针的区别寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。C...

    联系我们

    邮件:天华号@sina.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们