C/C++中指针间的互相赋值
本篇文章分为三个大的部分
大标题1提出权限“概念”,大标题2验证赋值规则
大标题3、4、5是我的个人理解。
大标题6是最直接的结论。
提醒
看懂这篇文章可能需要你知道并理解四种指针的定义,这是基础。当然如果真的不懂,可以直接去文尾记住结论。
四种指针详解戳这https://www.cnblogs.com/chouxianyu/p/11269993.html
指针修改指向内容的权限
普通指针=指针常量>常量指针=四号指针
这个权限指的是通过该指针是否可以修改内存,情况只有两种:是和否。是的话就有权限,否的话就没有权限,这个大小是0和1,false和true,是有和没有,不是12345678的大和小。
普通指针很好说,四号指针也是个常量指针嘛,当然不可以修改内存
这个权限大小关系不难理解,前提是你有理解常指和指常这两个名词吧。
前边的普指和指常都可以修改内存中的内容,而常指和四号则不可以。
指针赋值规则
指针间的赋值:权限大的可以赋值给权限小的(权限指操作内存即修改内存中的内容的权限)
权限大的可以赋值给权限小的,同级权限也可以,小赋值给大不行。
const int n = 0; //常量n
int m = 0; //变量m
int* p1; //普通指针
const int* p2; //常量指针 与int const* p2相同
//int* const p3=nullptr; //指针常量
//int const * const p4; //四号指针 既是常指又是指常,即自身不可修改,也不可通过它修改指向的内存
p1 = p2; //error 普指=常指
p1 = p3; //correct 普指=指常
p1 = p4; //error 普指=四号
p1 = &n; //error 普指=常指
p1 = &m; //correct 普指=普指
p2 = p1; //correct 常指=普指
p2 = p3; //correct 常指=指常
p2 = p4; //correct 常指=四号
p2 = &n; //correct 常指=常指
p2 = &m; //correct 常指=普指
//p3是指常,是常量 赋值当然不行了,更别说权限了,所以上边不定义p3,
//要讨论的是权限,在此定义并初始化以作示例,但定义只能有一个的啊,我在这提醒过了啊
int* const p3 = p1; //correct 指常=普指
int* const p3 = p2; //error 指常=常指
int* const p3 = p4; //error 指常=四号
int* const p3 = &n; //error 指常=常指
int* const p3 = &m; //correct 指常=普指
//p4是四号,是常量,同p3,不赘述
int const * const p4 = p1; //correct 四号=普指
int const * const p4 = p2; //correct 四号=常指
int const * const p4 = p3; //correct 四号=指常
int const * const p4 = &n; //correct 四号=常指
int const * const p4 = &m; //correct 四号=普指
这个规则是我自己想出来的,可能书上云里雾里的背后就是这么个规律。我之前好像说过存在即合理..实际表述不太对,应该是存在就有原因。上边的代码应该囊括了所有“品种”指针的互相赋值,验证也都符合预期。如有错误,欢迎指出。
赋值规则的过程
赋值得要满足被赋值方的要求,就像你想娶我(捂脸),我就需要你一米八,宠我,其他的都不需要,有的话我也一点不碰。但只要你这两点缺一点,我就不要,你是马云爸爸也不行!
赋值就是那么个意思,我是指常或者普指,我要求有权限修改内存,所以就只有指常和普指能娶我,能给我赋值,因为常指和四号没有那个权限啊!反过来的话,我是常指和四号,我什么都不要,所以谁赋值都行,上面我们也能看到给常指和四号赋值的时候全都correct了。
赋值规则的必要性
赋值规则前提是不同指针的权限不同
我想多种指针是为了程序更好吧,不然只有一种指针能实现所有的功能,岂不是很可怕。给了程序员太大的权利,程序员一跑神犯错,程序就极有可能崩溃。给予指针权限之差就像c++里override吧,也是一种对程序员的友好?这是一方面,这应该能说明赋予指针不同权限的必要。
然后才有了赋值规则
我们举个例子,如果没有这个规则,不同类型指针自由互相赋值:你定义一个常量n,然后再定义一个int* p,就是普指,普指按说是有修改内存的权利的,然后p=&n,拿到n的地址,是不是就可以通过p改变n了?(在存在不同权限指针的前提下)。如果没有这个规则,我们可以很随意地改变常量了。干嘛自己造了一座木屋,然后又给它浇上油?
斗胆扯内存
不管是指针常量还是常量指针还有普通指针,它们本身和那块内存都是没有本质关系的。
它们(也包括普通类型的指针)只是一个带着镣铐或者没有镣铐的工具,我们可以通过const控制指针的权限以及它本身,同时我们在使用它们时也不能超出它们的权限范围和它们的个人承受力。
结论
int* p1; //普通指针
const int* p2; //常量指针 与int const* p2相同
int* const p3=nullptr; //指针常量
int const * const p4; //四号指针 既是常指又是指常
p1和p3可以互相赋值;
p2和p4可以互相赋值;
p1和p3可以给p2和p4赋值,反之不行;
p3和p4在程序中只能在定义时被赋值一次,因为它们是const类型的量。
作者:@臭咸鱼
本文为作者原创,转载请注明出处:https://chouxianyu.github.io/2018/09/01/指针间的互相赋值/#more
欢迎转发和评论