指针和引用
指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元。
引用:变量的别名,对引用的操作与对变量直接操作完全一样。
区别:
(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
(7)指针和引用的自增(++)运算意义不一样;
const
★常量指针(const 作用的是 值):指向常量的指针,在指针定义语句的类型前加const,表示指向的对象是常量。
int a = 1,b = 3;;
const int* p = &a;
// *p = 4; // error ,p 指向的内容不能改变
p = &b; // ok
cout << *p << endl; // 输出3
★指针常量(const 作用的是 变量p):指针常量定义"int* const pointer=&b"告诉编译器,pointer(地址)是常量,不能作为左值进行操作,但是允许修改间接访问值,即*pointer(地址所指向内存的值)可以修改。
int a = 1,b = 3;;
int* const p = &a;
*p = 4; // ok
// p = &b; // error,const修饰变量p,表示p不能改变
cout << *p << endl; // 输出4
★常量指针常量:p指向的值和p都不能变
int a = 1,b = 3;;
const int* const p = &a;
// *p = 4; // error
// p = &b; // error,const修饰变量p,表示p不能改变
cout << *p << endl; // 输出1
★引用本身就是常量,即不可以改变指向。