您的位置:首页 > 编程语言 > C语言/C++

《C++ Primer》读书笔记-第二章 04 指针和引用

2016-11-14 09:31 274 查看
作者:马志峰

链接:https://zhuanlan.zhihu.com/p/23361546

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:

文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
原书有更加详细、精彩的释义,请大家购买正版书籍进行学习。
本文仅作学习交流使用,禁止任何形式的转载

复合类型

复合类型是指基于其他类型定义的类型

C++中有多种复合类型,我们先学习指针和引用

上一节讲到,变量定义的基本形式是:

类型说明符
一个或多个变量名组成的列表(以逗号分隔)
分号结束
其实还有一种更通用的说法:

类型说明符
一个或多个声明符组成的列表(以逗号分隔)
分号结束
对于基本类型来说,声明符指的就是变量名
对于复合类型来说,声明符指的是特殊符号+变量名
比如,可以这样定义一个引用类型的变量:

int ival = 1024;
int &refVal = ival;


可以这样定义一个指针类型的变量:

int ival = 1024;
int *p = &ival;


引用

区别于普通类型的变量,引用有以下几个特点:

引用只是别名,定义引用时,程序把引用和它的初始值绑定在一起
引用本身不是对象,编译器不会为引用分配内存空间,它只是一个别名
牢记以上两点就很容易理解引用了:

引用必须初始化(定义时要执行绑定的过程)
对引用进行操作,实际是在操作引用绑定的对象(引用只是别名)

指针

和引用一样,指针也能实现对其他对象的间接访问。

指针和引用的最大区别就是,指针本身是一个对象
指针和普通变量的最大区别是,指针存放的是其他对象的地址
前面我们用&操作符进行引用的定义,它同时也是取地址符

int ival = 1024;
int *p = &ival;


&操作符取出变量ival的地址赋值给指针p

同样的,*操作符也具备两重身份,它同时也是解引用符

int i2 = *p;


对指针解引用得到的是指针所指的对象

对指针p解引用得到它所指的对象ival,然后ival的值用于初始化新定义的整型变量i2。

复合类型的声明

在理解复合类型变量的定义时,断句很重要

int *p;
int* p;


上面两句都是合法的,但是第二句容易迷惑新手,比如

int* p, p1, p2;


我们会误以为p1、p2也是指针,其实只有p是指针。在理解时严格按照变量定义的基本形式就很简单

变量定义的基本形式:

类型说明符
一个或多个声明符组成的列表(以逗号分隔)
分号结束
int是类型说明符,*p、p1、p2组成声明符列表。因此只有p是指针

推荐使用 int *p的形式

还可以在一条语句中同时定义指针和引用

int ival = 1024, &refVal = ival, *p = &ival;


更复杂的情况

int ival = 1024;
int *pi = &ival;
int **ppi = π


以及

int i = 42;
int *p;
int *&r = p;


遇到这种复杂的情况时,我们可以使用从右向左阅读的方法

离变量名最近的符号对变量的类型有直接的影响,ppi是一个指针,r是一个引用
声明符的其余部分用来确定关联对象的类型,ppi指向的是一个指针,r引用的也是一个指针
那么

int ***pi2;
int **&r2 = ppi;


也可以按照这样的方法来理解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++