在c++primerplus中,这样写道,引用为对象取另一个名字。 引用类型 引用另一种类型 将写成&d 的形式定义引用类型
程序把引用和和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦引用完成,引用将和她的初始对象一直绑定在一起。也就是说引用必须初始化。
引用不是对象,所以编译器没有给它开辟空间
比如 int r1 = 10; int &d = r1;
指针,指向另一种类型的复合类型。与引用类似,可以实现对其他对象间接访问。不同点是,指针本身是对象,允许赋值和拷贝,而且在生命周期内可以,先后指向几个不同的对象。其次,指针无须定义时初始化,和其他内置类型一样,在块内定义的指针没有初始化,会拥有一个不确定的值。这也就是野指针。
指针的值也就是地址,有四种状态:
1.指向一个对象
2.指向紧邻对象所占空间的下一地址
3.空指针,没有指向任何对象
4.无效指针,除以上其他情况。
其他几个特殊指针
野指针:指向的内存空间被释放或者未分配内存空间的指针,程序猿试图访问指针指向内存,就会发生未定义行为,而是程序崩溃。
悬浮指针:指针指向的内容失效(生命周期已经结束了,也就是占用的内存空间被释放),再次通过指针去访问,访问无效地址,同样出现未定义行为。(举个例子,比如说,你的朋友昨天告诉你,他家的地址,然后你打算明天去拜访他,但是他今天搬家了,你说你还能找到你朋友的家吗?笑哭)
引用和const
指针和cosnt
const
const限定符,希望英一这样一种变量,它的值不被改变
因为const对象一旦创建其值就不能再改变,所以const对象必须初始化
当以编译初始化的方式顶一个const对象时,编译器将在编译过程中把用到该变量的地方都替换成相应的值。为了实现替换,编译器就必须知道变量初始值,但如果程序包含多个文件,则每个用了const对象的文件都必须能够访问到它的初始值才行。简言之,每个文件都要对const对象进行初始化。当多个文件中出现同名的const变量时,其实是等同于在不同文件中分别定义了单独的变量,如果要实现同名const变量实现共享,需要在一个文件定义const,而在多个文件中声明并使用它。解决办法:对于const变量不管是声明还是定义都添加extern关键字。例如,在file_1.cc文件中定义常量 extern const int bufSize = fcn();在file_1.h头文件中声明extern const int bufSize;
const的引用,对常量的引用 const int c1 = 1024; const int &r1 = c1;
r1 = 1025; //错误,对常量的引用
对const的引用有有两个特例,其余的引用的类型必须与其所引用对象的类型一致
例1: int i = 42; const &r1 = i; //允许将const int& 绑定到普通 int 对象上
例2:允许一个常量引用绑定到一个非常量对象、字面值,甚至是一般表达式
double dval = 3.14; const int &r1 = dval;
//实际编译器会创建一个临时对象
double int temp = dval; const doube &r1 = temp;
const 和指针
与引用一样,可以令指针指向常量或者非常量。
指向常量的指针,不能改变所指向对象的值
const double pi = 3.14;
const double *p = π
常量指针 指针类型必须和所值对象类型一致,但也有例外,允许常量指针指向一个非常量对象
double val = 3.14;
const double * p = &val;
解释:指向常量的指针或引用,不过是指针(引用)他们的自以为是,他们本身认为指向的对象内容不能修改,觉得自己指向了常量,所以自觉地不去修改所指向的对象的值,但你想啊,原始的对象在定义,然后初始化,只要原始对象不是常变量,他的值就是可以修改的啊。
const指针 常量指针
指针是对象,那么也可以向其他对象一样,允许指针本身定为常量。常量指针必须初始化,一旦初始化后,它的值不会再发生改变。
把 *放在const关键字之前以说明指针是一个常量。也就是说指针本身是不变的而不是指向的那个值。
const double pi = 3.14;
const double *const pip = π