关于C++中指针以及const的一些整理

参考CPP primer 第五版
首先要知道指针是一种复合类型,其能对其他对象进行间接访问
由于指针和引用比较相似,不妨从指针和引用之间的区别来深入理解一下指针
首先是指针与引用的一些对比:
1.指针本身就是一个对象,而引用不是,引用本质上只是和它绑定对象的一个别名,指针在其生命周期内可以先后指向不同的对象,而引用一旦绑定不可更改
2.指针不需要在定义的时候赋初值,而是和很多内置类型一样,如果在块作用域内未初始化的话则有一个不确定值,在全局作用域自动赋0,而引用必须赋初值

指针的值应该有以下4种状态之一
1.指向一个对象:一般用法
2.指向紧邻对象所占空间的下一个位置
3.空指针
4.无效指针
要注意的是对于无效指针的一些操作很容易引发错误且编译器一般也不会发现这类错误,因此在访问指针的时候最好先判断其是否有效

空指针:一般在块作用域里面定义一个指针且暂时不需要用到的时候尽量先初始化为空,用nullptr;

要注意的是,如果用(==,!=)这种运算符对两个相同类型的合法指针比较的话,比较的是地址值,如果地址值不同内容相同,则仍然是!=;

比较特殊的一类指针: void *指针:
其可以存放任意对象的地址,不管是int,char还是什么,
但其所能做的操作有限
1.与其他指针比较
2.作为函数的输入输出或者赋给另一个指针
要注意的是其不能直接对其指向的对象进行任何操作,哪怕是访问

指向指针的指针:
之前说过指针也是一个对象,那么其本身也占用了一些空间,指向指针的指针指向的就是这一些空间

const的用法:一旦创建就无法修改,定义时必须初始化
默认装态下const变量只在当前文件有效,要想多个文件同时使用的话就需要都加extern(与变量不同,变量只需要在使用时声明即可,这个需要在定义的时候加)

const的引用:
注意的是很多人认为引用就必须是和其绑定的类型一致,其实不然,有几种特殊情况,其中一种就是常量引用可以用任意表达式作为初始值,只要这个表达式结果能转化为其引用的类型即可
比如

const int t=10;       (1
   int m=10;          (2
   int &k=2*m;        (3
 const	int &n=t*2;   (4

第三行错误,但第四行正确
为什么呢?
其实是因为编译器在对一个常量引用进行绑定的时候,定义了一个中间常量变量,再将这个结果赋给了这个常量引用

值得注意的是对const的引用也可以引用一个非const 的对象,但不允许通过引用修改它

指向常量的指针不能改变其所指的对象的值,而且如果要想指向一个常量,必须用指向常量的指针,用普通的指针会报错
如:

const int N=100;
   int *q=&N;

之前提到了,虽然指针类型必须与其所指对象的类型一致,但有两种情况例外,其中一种是:允许一个指向常量的指针指向一个非常量对象,这一点和引用很相似,而且同样不允许通过指向常量的指针来修改这个非常量对象。这里其实可以理解为编译器默认了这个指向常量的指针指向的就是常量,所以不允许通过它来改变所指对象。

而与指向常量的指针要区别的就是常量指针,表示的就是该指针不能改变其所指对象,同时和常量对象一样,必须得初始化,注意定义的写法:

int a=0;
int *const ca=&a;  //ca是一个常量指针
const int *ba=&a;   //ba是一个指向常量的指针
const int *const  da=&a;  //da是一个指向常量对象的常量指针

那么到底怎么才能不混淆呢?
书上给的方法是从右向左读,比如对于

int *const ca=&a;

从右往左读,变量ca的左边是const,表示的是ca一定是一个const的对象。
而对象的类型由其声明符的其他部分确定,int后面是一个*,表示对象的类型是一个指针,故ca肯定是一个常量指针。

不过常量指针是允许对指针所指对象进行修改的,这里的常量指的是指针本身是常量。

对于这个语句

 const int *const  da=&a; 

是不是对这前面和后面的const表示很迷惑呢?
int前面的const其实是叫做底层const(low-level const),而int后的叫顶层const(top-level const),顶层const表示的意思是指针本身是常量,而底层const表示指针所指对象是常量,而且不止是指针,其他类型也是。

我们知道了指向常量的指针或者对常量的引用是可以指向或绑定非常量的,但反过来可不行,这也是底层const对象的局限性,当一个底层const对象在进行赋值的时候,其赋值对象必须也是底层const,可以理解为比如对于一个指向常量的指针,其要赋值给别人的话,相当于把它指向的对象的地址给了那个人,但由于这个对象是常量,不能随便用一个指针就指向常量,而是必须用底层const指针,引用也是同理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值