Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 190|回复: 0

[默认分类] 如何理解const char*, char const*, char*const等

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-10 13:29:03 | 显示全部楼层 |阅读模式



    很惭愧,当程序员这么久对这些的区别还是一知半解。
    究其原因是没有找到很好的理解方式,今天重新复习了下,终于找到一点奇技淫巧来记忆,我想以后应该再也不会忘了。
    不过奇技淫巧终归不是正道,弄不好走火入魔,忌者慎练。
    不过说不定这就是正道,反正通过它我自认为是记下来了,所以写出来分享下。
      
    首先看看下面这些声明:
      
    const char *p; //*p是const,p可变
    const (char *) p;//p是const,*p可变
    char* const p; //p是const,*p可变
    const char* const p; //p和*p都是const 

    char const * p;// *p是const,p可变
    (char*) const p;//p是const,*p可变
    char* const p;// p是const,*p可变
    char const* const p;// p和*p都是const
      
      
    上面这些声明意义,及他们的区别你都记住了吗?反正我是记不住,打死也记不住。
    听说Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:
    把一个声明从右向左读。
    char * const cp; ( * 读成 pointer to) cp is a const pointer to char
    const char * p; p is a pointer to constchar;
    char const * p; 同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。
      
    这方法是不错,但还得好好去理解翻译出来的东西,觉得呈现出来的意思不够直接,明了。
      
    下面是我的奇技淫巧:
    方法也是从右向左一步一步来解释,而且每一步都有返回值,是的你没看错,有返回值。每一步都相当于一个函数,上一步的返回值即是下一步的入参。
    拿const char *p;来说吧
    1,“p”:代表内存的一块空间,暂且称为”内存1”, 返回值当然是p了,也就是内存1。
    2, “*” :当p被星了之后,就跳到新的内存位置,也就是“内存2”。 内存2就是我们说的*p, 这时返回值就是内存2。
    3,“char”: 因为上一步的返回值是内存2,所以这个char就作用在内存2上,就像是在说这里存的是一个char类型数据。 返回值还是内存2。
    4,“const” :上一步返回内存2(具有char特点的内存2),这时const就作用在内存2上,结果就是说内存2不能变了,他是常量。返回值还是内存2(具有char特点和const特点的内存2)。
    5,如果前面还有修饰符,应该可以这样再推下去(起码我是这么想的^-^)
    6,前面的都解释完了,不是吗
      
    再来看个例子:
    const (char *) p;
    1, “p”:代表内存的一块空间,称为”内存1”,返回值当然是p,也就是内存1。
    2, “(char*)”: 整个修饰p,因为不是*,不会跳转到新的内存,所以返回值还是p,还是内存1。
    那“(char* )”什么意思呢,他相当于是一个自定义类型,就像一个自定义函数,简称大函数,由两个小函数构成。
    函数1是“*”,函数2是“char”。
    函数1“*”的处理结果是跳到另一块内存,即内存2,返回值是内存2。
    函数2“char”的处理结果是说内存2是char类型,返回值是内存2。
    只可惜这个返回值被大函数隔离了,大函数作为一个整体返回的是入参的那块内存。
    如果有一天这个大函数只有一个小函数,这个小函数是“*”,即大函数数“(*)”,这时别以为“*”和“(*)”有什么区别,就是差个马夹而已。
    3,“const”:修饰上一步返回的内存,即内存1
      
    注意:不要被这里的内存1,内存2诱导,我可没说给他们开辟空间了,声明时是不开辟空间的。
    只有在实际赋值之后,内存1,内存2才有对应的实际的内存空间。
    所以声明,只是在使用之前先描述一下这个变量具有什么特点,如何来使用这个变量而已。
    所以不管是说内存1是const,或内存2是const,并不是说实际的那块内存真的就不能改了(实际上也做不到)。
    这里对声明的变量赋值实际上是提供了对某块内存访问的一个方法。Const,char都是描述了这个方法的一些特点;而“*”的作用是跳转到另一块内存。
      
      这种方法帮我很轻松就理解了这些个抓狂的问题,不知你看明白了没有。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-3-29 02:17 , Processed in 0.352109 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表