码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Primer笔记——typedef指针类型别名时的const陷阱


    目录

    一.typedef int* pint 与 const pint

    二.typedef const int *pint 与 pint

    三.总结


    《C++ Primer》中指出,typedef与指针代指复合类型别名时,可能有意向不到的情况。

    下面我们以int为例:

    一.typedef int* pint 与 const pint

    此时typedef的类型是int的指针,即指针类型。

    既然pint本身是指针类型,那么const pint修饰的就是指针类型,pint本身就是指向int的常量指针。

    即const pint可以改成这种形式:

    const pint -> int* const

    而人们往往会错误的替换成const int*的形式,这就是误解了const的修饰对象。 

    以下面代码为例:

    1. typedef int* pint;
    2. int a = 1;
    3. int b = 2;
    4. const pint p = &a;
    5. //即int* const p = &a
    6. p = &b;//错误,常量指针不能修改指向
    7. *p = 3;//正确,指针指向int变量
    8. //注意:const pint p 与 pint const p等价

    那么怎样才能得到我们想要的const int*呢? 

    二.typedef const int *pint 与 pint

    虽然pint还是一个指针类型数据,但因为const int的存在,此时int是const类型的数据。

    pint此时指向const int,即指向常量int的指针。

    此时pint可变为如下形式:

    pint -> const int* 

     以下面代码为例:

    1. typedef const int* pint;
    2. int a = 1;
    3. int b = 2;
    4. pint p = &a;
    5. //即const int* p = &a;
    6. *p = 3;//错误,p指向常量
    7. p = &b;//正确,p本身是指针变量

    三.总结

    只要typedef中没有声明const,那么指针永远指向变量。

    只要类型别名在使用时有const修饰,那么指针永远是常量指针。

    即typedef中const决定指向对象属性,定义时const决定指针自身属性。

    说的官方一点就是typedef决定底层const,定义决定顶层const。 

    可以总结出如下表格:

    typedef定义替换形式含义
    typedef int* pint;pint p = &a;int* p指向变量的指针
    const pint p = &a;int* const p指向变量的常量指针
    typedef const int* pint;pint p = &a;const int* p指向常量的指针
    const pint p = &a;const int* const p指向常量的常量指针

    先解决问题再写代码——John Johnson


    如有错误,敬请斧正 

  • 相关阅读:
    【xshell7】设置语法高亮(突出显示集)方式
    趣谈网络协议_1
    [Win11]解决PS/2标准键盘带感叹号,笔记本键盘无法使用。代码19:由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个
    半监督学习在恶意软件流量检测中的应用
    C++——关键字|命名空间|输入&输出|缺省参数|函数重载|引用
    Spring面试题(六十道)
    茶百道全链路可观测实战
    Python入门系列(十一)一篇搞定python操作MySQL数据库
    【毕业设计】RFID智能门禁系统 - 单片机 物联网 嵌入式
    腾讯课堂批量下载视频
  • 原文地址:https://blog.csdn.net/weixin_61857742/article/details/127948434
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号