引用:

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

使用方式:

int cnt = 1024;

int &x = cnt;

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

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

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

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

int cnt = 1024;

int &x = cnt;

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

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

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

 int &x = ;//错误用法

 const int &x = ;//正确用法

指针:

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

使用方式:

int cnt = 1024;

int *x = &cnt;

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

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

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

1.指向一个对象;

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

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

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

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

空指针

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

声明一个空指针的方法:

 int *p1 = ;

 int *p2 = nullptr; //等价于int *p2 = 0;

 //使用nullptr需先引用头文件cstdlib 且使用c++11编译环境

 int *p3 = NULL;

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

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

如:

 int cnt = ;

 int *p = cnt;

 //不能通过编译。

 const int cnt = ;

 int *p = cnt;

 //在c++11之前能通过编译的,不过 c++11标准之后就不行了。

void * 指针

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

如:

 int cnt1 = ;

 int cnt2 = 3.14;

 int *p;

 p = &cnt1;

 p = &cnt2;

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

指向指针的引用:

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

 int cnt = ;
int *p = nullptr;
int *&r = p;//r是一个对指针p的引用 r = &cnt;//r引用了指针p, 赋值&cnt给r即赋值&cnt给p
cout << (*r) << " " << (*p) << endl;//输出1024 1024
*r = ;//解引用r得到0,即p指向的对象的值改为0
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. 一种js异步处理方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. app端内容播放,web端的玩具,app通过websocket远程遥控玩具播放内容,玩具管理页面

    一.app端内容播放 下载代码 https://github.com/987334176/Intelligent_toy/archive/v1.0.zip 注意:由于涉及到版权问题,此附件没有图片和音 ...

  3. 循序渐进Python3(十三) --0-- django之form表单

    django为我们提供了form表单验证功能,下面来学习一下: 武sir博客:http://www.cnblogs.com/wupeiqi/articles/5246483.html  创建了djan ...

  4. angularJS笔记之过滤器

    angular的过滤器用法: 1.模板中使用 {{expression|filter}} 也可以多个filter连用 {{expression|filter1|filter2|...}} filter ...

  5. C#操作SQLIte数据。

    using System; using System.Data; using System.Text.RegularExpressions; using System.Xml; using Syste ...

  6. Spring总结五:小结 使用spring访问servlet

    使用spring访问servlet 首先先建一个web项目,并在pom.xml中引入依赖包:spring-context和jsp servlet相关包,以及tomcat插件 其次建一个spring的配 ...

  7. MAC通过SSH使用PEM文件登录

    1.命令如下 ssh -i key.pem ssh -i key.pem root@IP 如果出现报错说明这个问题是文件的权限太大了,需要给小点 sudo chmod 600 key.pem 然后再执 ...

  8. 设置MongoDB课程环境

    Setting Up Your Course Environment This course is designed to be very hands on. Virtually all of the ...

  9. c语言学习笔记 多级else if 和switch case有什么区别

    ; ) { dosth(); } ) { dosth2(); } else if(opion==) { dosth3(); } else dosth4(); 如果给option的一个值是2的话,那么程 ...

  10. 写一段php代码,确保报个进程同时写入同一个文件