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

 更新时间:2019年04月20日 10:22:34   转载 作者:青青胡杨  
这篇文章主要介绍了C++中指针和引用的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、指针和引用的本质(是什么)

(1)指针是存放内存地址的一种变量,特殊的地方就在它存放的是内存地址。因此,指针的大小不会像其他变量一样变化,只跟当前平台相关——不同平台内存地址的范围是不一样的,32位平台下,内存最大为4GB,因此只需要32bit就可以存下,所以sizeof(pointer)的大小是4字节。64位平台下,32位就不够用了,要想内存地址能够都一一表示,就需要64bit(但是目前应该没有这么大的内存吧?),因此sizeof(pointer)是8。
(2)引用的本质是“变量的别名”,就是给变量又重新起了一个名字,既然是“别名”,那么就一定要有本体。

2、声明和初始化时的区别

指针指向的是一个内存地址, 因此可以指向一块为0x00000000的地址,声明时可以暂时不初始化(不推荐),即pointer = NULL;

引用是变量的别名,别名就一定对应着一个“本名”,因此必须在声明时就初始化,且不能初始化为空。

3、使用时区别

(1)根据声明和初始化时二者的区别,指针在声明周期内随时可能会为Null,所以使用时一定要做检查,防止出现空指针、野指针的情况;而引用则不用再操这个心,只要初始化了,在哪里都可以直接使用,再也不用担心它会不会为空什么的了。
(2)指针因为自己存的是一个内存地址,既然可以存初始化(或者赋值)的地址,那么在指针生命周期内就可以存其他的地址,只要你是同一类型(不同类型这个对应的类型偏移不一样)的变量,对于指针都OK。

引用作为一个变量AA的别名,在它的整个生命周期内,它只能“从一而终”,始终是第一次初始化它的那个变量的别名,在这期间任何对它的操作,都等同于对变量AA的操作。

Talk is cheap,show you my code.

/** 指针和引用的例子 **/

  std::string s1 = "萝卜";
  std::string s2 = "青菜";
  std::string s3 = "鸡蛋";
  std::string s4 = "西红柿";
  /** 指针可以初始化为空 **/
  std::string *p_Str = NULL;
  /** 引用一开始必须初始化 **/
  std::string& r_Str = s1;

  p_Str = &s2;
  std::cout<<"我是指针"<<*p_Str<<std::endl; /** 青菜 **/
  std::cout<<"我是引用"<<r_Str<<std::endl; /** 萝卜 **/
  std::cout<<std::endl;
  std::cout<<"*********分别修改指针和引用***********"<<std::endl;
  /** 分别修改指针和引用 **/
  r_Str = s3; /** 试图让r_Str为s3的别名 **/
  p_Str = &s4; /** p_Str重新指向了s4 **/
  
  std::cout<<"我是指针"<<*p_Str<<std::endl; /** 西红柿 **/
  std::cout<<"我是引用"<<r_Str<<std::endl;  /** 鸡蛋 **/
  std::cout<<std::endl;
  std::cout<<"*********查看刚刚的修改对最初初始化的影响***********"<<std::endl;
  /** 貌似成功了,都按照意图修改了,但是,稍等 **/
  std::cout<<"我是s1"<<s1<<std::endl; /** 鸡蛋 !!!注意 !!! **/
  std::cout<<"我是s2"<<s2<<std::endl; /** 青菜 **/
  std::cout<<"我是s3"<<s3<<std::endl; /** 鸡蛋 **/
  std::cout<<"我是s4"<<s4<<std::endl; /** 西红柿 **/

  /** 
  发现s1 "萝卜" 被变成了和s3一样的"青菜",这也说明了任何对引用的操作都等同于操作原先的变量本身
  相比较之下,指针就自由度很高了,想指向谁就指向谁,并不会影响任何之前指向过的变量
  惊不惊喜,意不意外 :)
  **/

4、总结

一个不大恰当的比喻是,指针就像是一个可以(注意是可以,但未必一定)到处沾花惹草(可以随时指向任意地址)的“渣男”;而引用则像是一个只能“从一(谁初始化就跟谁)而终”的“老实人”。

另外,根据Scott Meyers在《More Effective C++》上所讲,只有当你确定需要一开始就初始化,并且不需要再指向其他类型时 使用引用,否则你都应该使用指针。

小弟认识粗鄙浅薄,有不当之处,请大佬轻拍。

以上所述是小编给大家介绍的C++中指针和引用的区别详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • VC++中HTControl的CHTButton按钮控件类用法实例解析

    VC++中HTControl的CHTButton按钮控件类用法实例解析

    这篇文章主要介绍了VC++中HTControl的CHTButton按钮控件类用法,对于大家进行VC++项目开发有一定的帮助作用,需要的朋友可以参考下
    2014-08-08
  • c++中的内联函数inline用法实例

    c++中的内联函数inline用法实例

    在本篇文章里小编给大家整理的是关于c++中的内联函数inline用法实例以及相关知识点,有需要的朋友们学习下。
    2019-09-09
  • c++几种基本的插入排序(图文)

    c++几种基本的插入排序(图文)

    这篇文章主要介绍了c++几种基本的插入排序(图文),需要的朋友可以参考下
    2014-11-11
  • C语言职工管理系统设计

    C语言职工管理系统设计

    这篇文章主要为大家分享了一份C语言职工管理系统设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • C++中的vector容器对象学习笔记

    C++中的vector容器对象学习笔记

    这篇文章主要介绍了C++中的vector容器对象学习笔记,其中文章最后标红的resize与reserve方法的差别特别需要注意,需要的朋友可以参考下
    2016-05-05
  • C 语言环境设置详细讲解

    C 语言环境设置详细讲解

    本文主要介绍C 语言环境设置,在不同的系统平台上,C语言的环境设置不同,这里帮大家整理了Liunx, UNIX,Windows 上安装C语言环境,有开始学习C语言的朋友可以参考下
    2016-08-08
  • C语言关系运算符实例详解

    C语言关系运算符实例详解

    本文主要介绍C语言的关系运算符的知识,这里提供实例代码以便参考,希望能帮助有需要的小伙伴
    2016-07-07
  • C/C++常用函数易错点分析

    C/C++常用函数易错点分析

    这篇文章主要介绍了C/C++常用函数易错点分析,包含了memset、sizeof、getchar三个常用函数的分析,需要的朋友可以参考下
    2014-08-08
  • 详解C++中static的用法

    详解C++中static的用法

    这篇文章主要介绍了c++中static的用法详解,C 语言的 static 关键字有三种用途,具体内容详情大家跟随脚本之家小编一起学习吧
    2018-05-05
  • 指向变量的常指针与指向常变量的指针详细解析

    指向变量的常指针与指向常变量的指针详细解析

    刚接触到指针时,关于指向变量的常指针和指向常变量的指针容易混淆,所以整理下,希望能够帮助自己也帮助到大家
    2013-10-10

最新评论