C++引用和指针比较 指针常量和常量指针
1.定义一个指针的时候可以不赋初始值,定义一个引用的时候必须有初始值。
int *x;//不报错
int &y;//报错
2.对于程序员来说指针变量包含两部分一个是指针指向的地址和指针本身自己的地址,所以可以对指针再进行取地址&。
对程序员来说引用变量只能获取它所指向的变量的地址,而无法获取引用变量本身的地址,它本身的地址由编译器进行支配。
int a = 5;
int *x = &a;
int &y =a;
std::cout<<x<<std::endl;//x指针指向的地址
std::cout<<&x<<std::endl;//x指针本身自己的地址
std::cout<<&y<<std::endl;//引用变量指向的地址
std::cout<<y<<std::endl;//引用变量指向的地址中存储的值,这里是5
3.引用的地址我们无法获取,所以不能定义指向引用的指针。但是可以定义指向指针的引用
int a = 5;
int* &p = &a;//这里定义了一个int指针类型的引用p,让p引用指向int类型的变量a的地址。
4.指针声明后它所指向的地址是可以改变的。
int a = 5;
int *x = &a;
std::cout<<x<<std::cendl;
int b = 6;
x = &b;
std::cout<<x<<std::cendl;//两次打印的x指针指向的地址是不一样的
变量声明后它所指向的地址是不变的。这点上类似于指针常量
int a = 5;
int &y = a;
std::cout<<&y<<std::cendl;
int b = 6;
y = b;
std::cout<<&y<<std::cendl;//两次打印的y引用指向的地址是一样的,改变的是y引用指向的这个地址中存储的值
5.常量指针和指针常量
(1)常量指针表示不可以通过这个指针来修改它所指向的地址所保存的值,但是可以通过原变量修改,可以修改这个常量指针指向的地址,它的声明方式是const在*之前如:const int * a;或者int const * a;
如果要声明一个指向常量的指针则必须将该指针声明为常量指针
int a = 5;
int b = 10;
const int * x = &a;
a = 7;//不报错,可以通过原变量修改变量的值,原变量a不是一个const 修饰的变量
*x = 6;//报错,因为x是一个常量指针,它指向地址中存储的值不能改变
x = &b;//不报错,可以改变常量指针指向的地址
(2)指针常量表示不可以修改指针指向的地址,但是可以修改它指向的地址中所保存的值,它的声明方式是const在*之后,如:int * const x;
int a = 5;
int * const x = &a;
a = 6 ;
*x = a;//不报错,可以修改指针常量所指向的地址中保存的值
x =&a;//报错,不允许修改指针常量指向的地址