c++中的指针和引用

来源:互联网 发布:java报表打印 编辑:程序博客网 时间:2024/05/17 01:31

此处回顾几个基本知识:
1. c++:引用和指针
c++相比于c,多了一个复合类型,就是引用。
引用本身不是对象,只是某个对象的另一个名字,所以引用必须被初始化。而且只能用一个对象初始化,不能用常数。之后的操作都是在对绑定的对象进行,而不是将初始值拷贝给引用变量。这重绑定关系存在整个生命周期,不能被更改。
指针本身就是一个对象,在内存中存储着指向对象的地址,通过间接寻址访问原来对象。作为对象,指针允许对它进行赋值和拷贝,而且在生命周期可以任意更改。第二个主要不同是,指针不需要在定义时就被初始化,和其他内置类型一样,默认初始化因不同情况而异。
reference也可以引用一个指针对象。

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

如上,reference就是作为别名初始化了指针并更改了指针变量的值。

2. const限定符
const的存在是为了保证一个常量不会在程序中被改变,比如buffer的大小等。
const只在一个文件中有效,不同文件中const需要被重新定义,也就是说不同文件中可以定义同一个名字的const变量。如果要全局共享,需要加extern,并在其他文件中声明。
const变量在定义时必须初始化。对const的引用和其他引用不同,不能修改引用对象的值。而且,对const的引用也有几个例外,可以在定义常量引用时引用任意表达式作为初始值,只要该初始值可以转化为常量类型,例如:

int i =42;const int &r1 = i;const int &r2 = 42;const int &r3 = r1 * 2;

以上定义都合法,即使上述改成double i = 42; 也可以。
还有一个问题就是常量引用一个非常量变量时,所以这个引用的值可能会因为那个常量被更改而更改。

int i = 42;int &r1 = i;const int &r2 = i;i = 0//合法,r2值被改变r1 = 0; //合法,此时r2值已经被改变r2 = 0; //不合法

指针和const:
因为指针比引用复杂,所以这里有两种情况,一个是指向常量的普通指针,一个是指针本身是常量。

tip: 判断一个变量的本质属性,从右往左看,第一个标识符最说明问题,如下
case 1:指向常量的常量指针

const double pi = 3.14;double *ptr = π //错误,常量不能用普通指针指向const double *cptr = π //正确*cptr = 42; //错误,不能给常量赋值

case 2:指针本身是常量

int errNum = 0;int *const curErr = &errNum; //这个指针中存的永远是errNum的地址,errNum本身内容可以被改变const double pi = 3.14;const double *const pip = π //指向常量的常数指针

简单来说就是常量必须被常量指针或者引用来指向,但常量指针或者常量引用可以指向一个非常量(此时非常量的值不能被常量指针或者常量引用改变)。可以理解为常量指针和常量引用自以为是的觉得自己指向的是一个常量。

原创粉丝点击