引用:

引用相当于给引用的对象起一个别名,对引用的操作即是对原对象的操作。

使用方式:

int cnt = 1024;

int &x = cnt;

一般情况下引用的类型要和被引用对象一致(例外是常量引用可以和对应的非常量对象绑定)。

一般在初始化变量时,初始值会被拷贝到新建的对象中。然而定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用将和它的初始值对象绑定在一起。因而无法令引用重新绑定到另外一个对象,因此引用必须初始化。

引用并非对象,它只是为一个已经存在的对象起另外一个名字。

定义了一个引用之后,对其进行的所有操作都是在与之绑定的对象上进行的:

int cnt = 1024;

int &x = cnt;

x = -1;//给引用x赋值为-1,即给cnt赋值-1,所以此时cnt的值为-1

因为引用不是对象,所以不能定义引用的引用(引用就是给一个对象起个别名,反之若一个变量不是对象,则起不能有引用)。

非常量引用不能与字面值绑定在一起

  1. int &x = ;//错误用法
  2.  
  3. const int &x = ;//正确用法

指针:

指针是指向另外一种类型的复合类型。与引用类似,指针也实现了对其他对象的间接访问。不过指针与引用又有很多不同点。其一,指针本身也是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。其二:指针无需在定义时赋初值。和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。

使用方式:

int cnt = 1024;

int *x = &cnt;

指针存放的是对象的地址,要获取该地址需要用取地址符(&)。

一般情况下声明指针的类型需要和其指向的对象类型一致(例外是常量指针可以指向一个对应的非常量对象)。

指针的值(即地址)应属于下列4种状态之一:

1.指向一个对象;

2.指向紧邻对象所占空间的下一个位置(如vector的end指针);

3.空指针,意味着指针没有指向任何对象;

4无效指针,也就是上述情况之外的其他值。

可以用解引用符获得指针的对象,但只能对指向某个对象的有效指针解引用。

空指针

空指针不指向任何对象,在试图使用一个指针之前应该先检查该指针是否为空。

声明一个空指针的方法:

  1. int *p1 = ;
  2.  
  3. int *p2 = nullptr; //等价于int *p2 = 0;
  4.  
  5. //使用nullptr需先引用头文件cstdlib 且使用c++11编译环境
  6.  
  7. int *p3 = NULL;

在c++11标准下应尽量使用nullptr给指针赋初值。

不能使用 int 类型给 int * 类型赋值,即便 int 变量恰好等于 0 也不行。

如:

  1. int cnt = ;
  2.  
  3. int *p = cnt;
  4.  
  5. //不能通过编译。
  6.  
  7. const int cnt = ;
  8.  
  9. int *p = cnt;
  10.  
  11. //在c++11之前能通过编译的,不过 c++11标准之后就不行了。

void * 指针

void * 是一种特殊类型的指针,可用于存放任意对象的地址。一个void*指针存放着一个地址,这一点和其它指针类似。不同的是并不能确定该指针中对象的类型。

如:

  1. int cnt1 = ;
  2.  
  3. int cnt2 = 3.14;
  4.  
  5. int *p;
  6.  
  7. p = &cnt1;
  8.  
  9. p = &cnt2;

是可以通过编译的。不过void*可以做的事比较有限:拿它和别的指针比较,作为函数的输入或输出,或者赋给另一个void*指针。不能直接操作void*指针的对象(不能将其赋值给void*外的其他类型指针,不能通过cout输出其所指对象等等)。

指向指针的引用:

引用本身不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在对指针的引用:

  1. int cnt = ;
  2. int *p = nullptr;
  3. int *&r = p;//r是一个对指针p的引用
  4.  
  5. r = &cnt;//r引用了指针p, 赋值&cnt给r即赋值&cnt给p
  6. cout << (*r) << " " << (*p) << endl;//输出1024 1024
  7. *r = ;//解引用r得到0,即p指向的对象的值改为0
  8. cout << (*r) << " " << (*p) << endl;//输出0 0

面对一条比较复杂的指针或引用声明语句时,要理解其类型到底是什么,最简单的办法是从右往左阅读其定义。离变量最近的符号(此列中*&r是&符号)对变量有最直接的影响,因此r是一个引用。声明符的其他部分用以确定r引用的类型是声明,此列中的符号*说明r引用的是一个指针,最后,声明的基本数据类型部分指出r引用的是一个int指针。

&(引用) 和 *(指针)的更多相关文章

  1. c++中的引用与指针的区别

    http://blog.csdn.net/lyd_253261362/article/details/4323691 c++中的引用与指针的区别 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存 ...

  2. nim的引用和指针

    nim语言的引用和其他语言的指针有点相似 可以提供一种“多对一”的关系 这就意味着不同的引用可以指向同一个内存位置 nim区分可被追踪的引用和不可被追踪的引用 不可被追踪的引用又称为指针 可被追踪的引 ...

  3. C++中引用与指针的区别(详细介绍)

    C++中引用与指针的区别(详细介绍) C++中的引用与指针的区别   指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一 ...

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

    1.引用只是变量的一个别名,并不占用内存空间,而指针是一个变量,里面保存着被指向的变量在内存中的地址: 2 引用只能在定义时被初始化一次,之后不可变,而指针可变: 3 引用没有 const,指针有 c ...

  5. [ZZ]C++中,引用和指针的区别

    (1) 引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针. 由于C++ 要求 reference 总是指向一个对象所以 re ...

  6. Java中到底有没有指针;同时注意引用和指针的区别

    Java中引用的作用类似于指针,但是有区别:()    (1) 指针必然指向一个内存地址,如果你定义的时候不指定,就会乱指(很可能造成安全隐患)但是引用定义出来后默认指向为空.     (2) 指针可 ...

  7. java定义类 对象,引用,指针

    java是根据面向对象编程,因此有类和对象的概念,类分为普通类与抽象类. 一.定义类 类由N个 构造器  成员变量  方法组成,可以不定义,也可以根据语法定义N个. [修饰符] class 类名{ 构 ...

  8. 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针

      您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...

  9. C、C++中引用与指针的区别

    1:引用的和指针在概念上的区别 引用是变量的别名,例如 int m; int &n=m; 引用作为一个别名.它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用 ...

  10. 浅谈C/C++引用和指针的联系和区别

    为什么C/C++语言使用指针? 答案:①一方面,每一种编程语言都使用指针.不止C/C++使用指针. 每一种编程语言都使用指针.C++将指针暴露给了用户(程序员),而Java和C#等语言则将指针隐藏起来 ...

随机推荐

  1. Rhel6.0部署Oracle10g报错相关问题记录

    1.libawt.so及libXt.so.6,lib*系列报错,到最后的界面ruiy哥我笑了!.相信你也会笑的!终于找到根源了!哇哈哈!希望后面不要报error in invoking target ...

  2. leetcode896

    class Solution { public: bool isMonotonic(vector<int>& A) { ) { return true; } bool GetDif ...

  3. MongoDB安全加固方案,防止数据泄露被勒索

    早上起来,发现生产数据库被删了,留下一个数据库名叫“PLEASE_READ”,里面内容如下: "Info" : "Your DB is Backed up at our ...

  4. C++数组与指针回顾总结

    //数组名是常量指针, //a+1 是相对数组起始地址偏移了sizeof(int)字节 //&a+1 是相对于数组起始地址偏移了sizeof(a)字节 , , , }; cout <&l ...

  5. localtime 的性能问题及其替代者

    在系统从redhat5升到redhat6的过程中,服务的性能差了很多.经过定位发现是程序中频繁调用localtime/localtime_r所致. 而调用localtime_r 的实现中,对时区进行了 ...

  6. MongoDB简介及基础知识

    MongoDB简介 一.MongDB是一个高性能,开源,无模式的文档型NosQL数据库.主要功能特性: 1.文件存储格式BSON(一种json的扩展) 2.模式自由,数据格式不受限了表的结构 3.支持 ...

  7. Linux ping不通外网

    在linux中ping www.baidu.com 无法ping通,可能原因是DNS没配置好 方法一: 修改vi /etc/resolv.conf  增加如下内容: nameserver 114.11 ...

  8. java Web 过滤器Filter详解

    简介 Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊 ...

  9. java switch(表达式)中表达式的类型

    java 1.6(包括)以前,只是支持等价成int 基本类型的数据:byte ,short,char,int(其他的都不可以). 1.7加入的新特性可以支持String类型的数据.

  10. 数字图像处理实验(8):PROJECT 04-04,Highpass Filtering Using a Lowpass Image 标签: 图像处理MATLAB 2017-05-25 0

    实验要求: 高通滤波器可以通过1减去低通滤波器的传递函数得到. 使用公式 计算可以的得到 . 实验代码: % PROJECT 04-04 Highpass Filtering Using a Lowp ...