指针:一个储存一个地址的整型对象,即一个整数,以指针所存地址开头,指针类型对应类型那么大(如char指针对应内存大小为1个字节)的那块内存,我们称作指针所指内存,编译器根据指针的类型操作指针指向内存。
引用:作为一个对象的别名,对引用的所以操作均可看做对其绑定对象的操作,并且引用在定义时必须初始化,且此后不能再改变它。
对于指针,有两种const。
1:constant pointer
常量指针,即指针本身即为常量。也就是不可以修改指针本身,指针像引用一样,初始化以后,从一而终。
2:pointer to constant 指向常量的指针。
这里指向常量的意思,并不是说,指针指向的那块内存真的是只读的,不可修改的,而且编译器这么认为,所以,你不可以通过指针做任何可能修改那块内存的行为,不仅如此,c++相对于c,还做出了一个合理的改变,禁止了pointer to constant 向pointer to variable 赋值,这个类型转换过程是禁止的,于是在c++里,我们就可以放心地使用const 常量而不用担心自己一不小心把常量给改了而只能使用宏,当然我不是说宏不好。只是const 感觉更自然。
接下来再说一下reference to constant
刚才说const 常量 可以放心使用了,就是因为我们断绝了通过指针间接改变它的途径,但是,除了指针外,还有一种方式可以间接改变内存,没错就是引用,为了防止这种尴尬的事发生,引用同样也有const 不能赋值给非const 的规则,此外常量引用还有一个神奇的地方就是可以接受字面值,于是如果在函数中我们不会修改参数的值,那么我们一般使用常量引用,这样就可以接受字面值减小可能的错误,但其实如果我们不想修改参数的话,一般我们直接使用形参就好,没必要使用引用。关于引用还有一点,一般来说,引用即别名,它只代表他所绑定的对象,但在作为decltype的参数时,会保留引用的特性。比如
int i;
int &ri=i;
decltype(ri ) v;
v的类型是int &而不是int故上面程序会报错。
最后说一下顶层const与底层const
其实底层const 就是对那些间接使用内存的变量的const
就是 pointer to constant 与reference to
constant,在一些类型转换过程中,会出现const 向非const 的转换,如
const int ci=1;
int i=ci;
上面说过的两种const类型向非const转换是被禁止的,这种怎么变都不会消失的const我们称作底层const,其他类型的const与之对应的我们称为顶层const。其实本来是为了概念的清晰理解引出的分类,结果因为讲特例讲的太细,差点把我绕晕了。