引用、指针和const
来源:互联网 发布:sql server 教程 高级 编辑:程序博客网 时间:2024/05/22 03:28
本文是学习《c++ primer》第五版第二章的学习笔记。有更新会再补充。
声明语句:基本数据类型+声明符
声明语句:基本数据类型+声明符
复合类型
引用(reference)
int ival = 10;
int &refVal = ival; // & 是引用标识符
- 必须初始化
- 必须初始化
int &refVal2 ; // 错误,未初始化
定义引用时,程序把引用和其初始值绑定(bind)在一起,而不是将初始值拷贝给引用。
- 引用不是对象,而是给已有对象起了另外一个名字。
- bind:现在引用和初始值绑定在了一起,就像是一条绳上的蚂蚱福祸相依,不管是引用和变量谁发生了改变,另一个都会随之改变。
- 引用的类型必须与其所引用对象的类型一致。有两个例外:
引用的例外一:初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。
int i = 42;
int &r1 = i;
const int &r2 = i; //r2是常量引用,绑定对象i(非常量),意思是不允许通过r2修改 i 的值
r1 = 0; // 正确,i的值修改为0,由于r2和i绑定在一起,r2也变为0;i的值也可以通过其他途径修改,r2也会跟着发生变化
r2 = 0; //错误,r2是一个非常量引用
指针(pointer)
int*ip1,*ip2;//允许没有初始化,此处 * 是声明的一部分
int ival=42,*p=&ival; //p存放变量ival的地址,或者说p是指向变量ival的指针;此处 & 是取地址符
cout<<*p;// 此处 * 是解引用符,输出指针p指向的对象
- 利用指针访问对象
如果指针指向了一个对象,则可以使用解引用符(操作符 * )来访问该对象。
- 指针的值(即地址),要属于下列4种状态之一:
- 指向一个对象;
- 指向紧邻对象所占空间的下一个位置;
- 空指针,意味着指针没有指向任何对象;
- 无效指针,是上述三种情况的其他值。
- 所有指针的类型必须和其所指向的对象严格匹配。有两个例外:
指针的例外一:允许令一个指向常量的指针指向一个非常量对象。
double dval = 3.14;
const double *cptr = &dval;//正确,但是不能通过cptr改变dval的值,dval自身可以通过其他途径改变
- 生成空指针的几种方法:
int *p1 = nullptr; //C++程序最好使用该方法
int *p2 = 0;
int *p3 = NULL; // 使用该方法需要先 #include cstdlib ,尽量避免使用NULL
- void* 指针可以存放任意对象的地址,我们对该对象是什么类型并不事先了解。
- 其他指针操作:
- 用在表达式中;
int *pi = 0;
if (pi) //条件等价于false
//...
- 用相等操作符(==)或不等操作符(!=)比较指针,比较的内容是指针存放的地址,结果是布尔类型。
int *p1 = nullptr; //C++程序最好使用该方法
int *p2 = 0;
int *p3 = NULL; // 使用该方法需要先 #include cstdlib ,尽量避免使用NULL
- void* 指针可以存放任意对象的地址,我们对该对象是什么类型并不事先了解。
- 其他指针操作:
- 用在表达式中;
int *pi = 0;
if (pi) //条件等价于false
//...
- 用相等操作符(==)或不等操作符(!=)比较指针,比较的内容是指针存放的地址,结果是布尔类型。
引用VS指针
复合类型的声明
指向指针的指针
通过 * 的个数可以区分指针的级别。
int ival = 42 ;
int *pi = &ival;
int **pi = π
指向指针的引用
要理解一个变量的类型到底是什么,最简单的方法就是从右向左阅读该变量的定义。距离变量名最的符号对变量的类型有最直接的影响。
int i = 42;
int *p;
int *&r = p; // 此处离 r 最近的符号是 & ,因此r 是一个引用,*说明r 引用的是一个指针
r = &i;
*r = 0;
const限定符
- 必须初始化,因为const对象一旦创建后就不可再更改
- 默认const对象仅在文件内有效,如果想在多个文件之间共享const对象必须在变量的定义前添加 extern 关键字。
- 只能在const对象上执行不改变其内容的操作。
const的引用(reference to const)
- 称为:对常量的引用(reference to const),简称“常量引用”,(二者是一个概念)但实际上不存在恒定不变的引用,这只是一个称呼。(主要是和“常量指针”对比。)
- 可以这么理解,对常量的引用十分讲究“门当户对”。引用的对象是常量(const对象),那么引用前也要有const;反之,如果引用定义为对常量的引用,就不能使其指向一个非常量对象。如下所示:
const int ci = 42;
const int &r1 = ci;//正确,引用及其对象都是常量
r1 = 42; //错误,r1是对常量的引用,不能对其赋值
int &r2 = ci; //错误,ci是一个常量,而引用r2没有加const限定符,就不能引用一个常量。
- 常量引用仅对引用可参与的操作做出了限定,对于引用的对象本身是不是一个常量未作限定,对const的引用可能引用一个并非const的对象,见上:#引用的例外一
指向常量的指针(pointer to const)
const double pi = 3.14;
double *ptr = π //错误,ptr不是一个常量指针,而试图指向一个常量,不够“门当户对”
const double *cptr = π //正确
*cptr = 42; //错误,指向常量的指针不能再被赋值
const double pi = 3.14;
double *ptr = π //错误,ptr不是一个常量指针,而试图指向一个常量,不够“门当户对”
const double *cptr = π //正确
*cptr = 42; //错误,指向常量的指针不能再被赋值
- 可以令一个指向常量的指针指向一个非常量对象,这是:#指针的例外一
常量指针(const pointer)
- 常量指针必须初始化,且初始化完成以后将不再改变,一直指向指针中存放的地址。
- 将*放在const前面,就表明这个指针是一个const。
int errNumb = 0;
int *const curErr = &errNumb; //curErr将一直指向errNunb
const double pi = 3.14;
const double *const pip = π //pip是一个指向常量对象的常量指针
顶层const
指针本身是不是常量和指针的对象是不是常量,是两个相互独立的问题,用顶层const (top-level const)表示指针本身是一个常量,用底层const (low-level const)表示指针所指的对象是一个常量。
0 0
- const引用和const指针
- const指针和const引用
- const 和 引用 指针
- const 指针和引用
- 引用、指针和const
- 指针和引用,const 指针和const 引用
- C++:指针、引用和CONST
- const的指针和引用
- 引用&指针和引用&const的关系
- 引用,const引用,指针
- const修饰指针和引用释疑
- const修饰指针和引用释疑
- 引用(reference)和const指针的区别
- const修饰指针和引用的用法
- 【杂记】引用和指针以及const
- const修饰指针和引用的用法
- const修饰指针和引用的用法
- const修饰指针和引用的用法
- 异步http报错Request cannot be executed; I/O reactor status: INACTIVE
- js动态添加table表的一行和删除一行
- BZOJ2084: [Poi2010]Antisymmetry
- u3d脚本学习二,实现坦克发出子弹
- 定时消失的对话框API函数 -- MessageBoxTimeout
- 引用、指针和const
- 监听网络状态
- http://blog.csdn.net/mzpmzk/article/details/51488494
- CSS3 Flexbox轻巧实现元素的水平居中和垂直居中
- 解析json
- JSON中 key 动态设置 以及JSON.parse 和JSON.stringify()的区别
- 乐观锁与悲观锁
- 在Linux操作系统上执行java代码,执行交互式命令
- 创新力量 · 财富盛宴【昆山千人大会】