c++的指针引用

来源:百度知道 编辑:UC知道 时间:2024/05/20 03:48:24
int a;
const int *&p=&a;//错误
int *const &p=&a;//正确
有人解释说:const 指针所指向的内容为常量,所以第一个错误。
但是如果这样说,书上有一个题目是这样的
int a;
const int *s=&a;
这个是正确的,const 指针所指向的内容为常量??
请问应该怎么去理解????
const int *&p=&a;//错误
int *const &p=&a;//正确
但是const int *s=&a;
为什么正确??

1 const 和数据类型结合在一起,形成所谓的“常类型”,然后利用常类型修饰变量,叫做常变量。 用长类型申明或者定义变量的时候const只会出现在变量的前面,const和被修饰的类型之间不能有其他标识符。

2 常引用变量修饰过后就必须初始化

所以const int *&p=&a;//错误
引用必须初始化
它指向了一个没有被初始化的内存所以错误。

int *const &p=&a;//正确因为P指向的内容可以改变,P本身不能改变。符合。。。

const int *s=&a;
这个是指针。。

这个应该是和const的位置有关,
第一个const修饰的int。其内容不能修改
第二个const修饰的指针。其地址不变。但是其地址存的内容可以改

int *const &p和 const int *&p所表示的意思是不一样的,前者是指该指针是常量,即它所表示的地址不能被修改;而后者该指针所指的内容是常量,该内容不能被修改。

首先理解一下,&a 的类型为 int * const ,因为 &a 是一个临时变量,不可以被修改,所以是 const 的。
根据 const 的定义,&a 可以被赋给一个类型为 const int * ,或 int * const,或 const int * const 的变量。
但题目中声明的是引用,而 &a 的返回值是一个“中间值”,不可以被修改,也就是说需要一个不可以被修改的引用。所以应该写成 const int * const & p ,或 int * const & p 。
所以 const int *&p=&a; 是错误的,因为 p 本身可以被修改,而后面的 &a 是不可以被修改的。