详解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++中指针和引用的区别详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • java及C++中传值传递、引用传递和指针方式的理解

    java的值传递理解: 代码1: public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer= new StringBuffer("colin"); SChange(buffer); System.out.println( buffer); } public static void SChange (StringBuffer str) { st

  • c++中引用和指针的区别和联系

    C++中的引用和指针 ★ 相同点: 1. 都是地址的概念:指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名(java中的引用其实也是别名的意思). ★ 区别: 1. 指针是一个实体,而引用仅是个别名:2. 引用使用时无需解引用(*),指针需要解引用:3. 引用只能在定义时被初始化一次,之后不可变:指针可变: 引用"从一而终" 4. 引用没有 const,指针有 const,const 的指针不可变:5. 引用不能为空,指针可以为空:6. "sizeof 引用&

  • C/C++ 数组和指针及引用的区别

    C/C++ 数组和指针及引用的区别 1.数组和指针的区别 (1)定义 数组是一个符号,不是变量,因而没有自己对应的存储空间.但是,指针是一个变量,里面存储的内容是另外一个变量的地址,因为是变量所以指针有自己的内存空间,只不过里面存储的内容比较特殊. (2)区别 a.对于声明和定义,指针和数组是不相同的,定义为数组,则声明也应该是数组,不可混淆 b.当作下标操作符时,指针和数组是等价的.a[i]会被编译器翻译成*(a+i). c.当数组声明被用作函数形参的时候,数组实际会被当作指针来使用. (3)

  • C++中指针和引用的区别分析

    从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量). 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程中,被调

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

    C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的

  • c++将引用或者是指针作为函数参数实现实参的运算

    C++增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能,较指针参数来得更加安全直观.将引用作为参数传递的时候,实参初始化形参的时候不分配内存空间,也不调用拷贝构造函数,因此更加能够提高运算的性能.所以我们应该尽可能地使用引用,而非指针,但是应该要注意,因为局部变量具有自己短暂的生命周期,因此不能够返回对一个局部变量的引用. 引用通常是在被定义的时候被初始化,但是当它作为参数的时候,则是在被调用的时候被初始化.这时候对引用所做的改变就是对被引用的变量所做的改变. 引用对变量的访问是

  • C/C++中指针和引用之相关问题深入研究

    一.基本知识指针和引用的声明方式:声明指针: char* pc;声明引用: char c = 'A'   char& rc = c; 它们的区别:①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变.这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象.但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变. ②从内存分配上看,程序为指针变量分配内存区域,而不为引用分配内存区域,因为引用声明时必须初始化,从而指向一个已经存在的对

  • C++ 中引用与指针的区别实例详解

    C++ 中引用与指针的区别实例详解 引用是从C++才引入的,在C中不存在.为了搞清楚引用的概念,得先搞明白变量的定义及引用与变量的区别,变量的要素一共有两个:名称与空间. 引用不是变量,它仅仅是变量的别名,没有自己独立的空间,它只符合变量的"名称"这个要素,而"空间"这个要素并不满足.换句话说,引用需要与它所引用的变量共享同一个内存空间,对引用所做的改变实际上是对所引用的变量做出修改.并且引用在定义的时候就必须被初始化.     参数传递的类型及相关要点: 1 按值

  • 深入理解c++指针的指针和指针的引用

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递. 如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值.我们用下边的代码说明一下问题: int m_value = 1; void func(int *p) { p = &m_value; } i

  • 详谈C++引用&和指针在作为形参时的区别

    int n; int &m = n; 在C++中,多了一个C语言没有的引用声明符&,如上,m就是n的引用,简单的说m就是n的别名,两者在内存中占同样的位置,不对m开辟新的内存空间,对m的任何操作,对n来说是一样的. 对于引用,有以下三条规则: (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化). (2)不能有NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL). (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象). 假如在一个函数中

随机推荐