V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxCoder
V2EX  ›  C

刚刚突然感受到了 C 语言指针的神奇之处

  •  
  •   zxCoder · 2023-10-01 22:42:55 +08:00 · 2142 次点击
    这是一个创建于 423 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以前大学学 C 的时候,只是说指针就是地址。

    这么多年没再碰 C 语言,刚刚发现,其实指针除了是一个地址,应该还包含“如何去读取这个地址的值”这个东西?

    同样的地址,赋值给 int 指针和 char 指针,读取来的东西肯定是不一样的,感觉很有意思。

    mightybruce
        1
    mightybruce  
       2023-10-01 23:49:52 +08:00
    这没什么神奇, 不过将 int 指针赋值给 char 指针是没有意义的事情。这个存放的值其实还和字节序大小端有关。

    如果你将结构体指针转换为 char 指针或字节指针 还有点实际用处,当然不能将指针直接赋值另一个指针。
    githmb
        2
    githmb  
       2023-10-02 02:42:32 +08:00
    啊这
    LUO12826
        3
    LUO12826  
       2023-10-02 06:23:34 +08:00
    “如何去读取这个地址的值”这个东西其实就叫类型。如果进一步提问,还可以问出“为什么一个地址需要有类型”以及“类型存在于编译期还是运行期”,哈哈。虽然这些问题显得有点呆,但从来没想过的人还真会一下子愣住。
    zzzsy
        4
    zzzsy  
       2023-10-02 09:07:54 +08:00 via Android
    甚至类似结构体继承 https://en.m.wikipedia.org/wiki/Type_punning :)
    tomisj
        5
    tomisj  
       2023-10-02 10:35:13 +08:00 via Android
    「如何读取这个地址的值」其实是和语境高度相关的,所以 C 很容易就把内存玩坏,也是因为这个,C 可以用来干一些神奇的事情。
    jazzsama
        6
    jazzsama  
       2023-10-02 10:39:37 +08:00
    当然不只是地址,否则为什么还需要指针类型呢?
    yolee599
        7
    yolee599  
       2023-10-02 10:45:37 +08:00 via Android
    其实内存中的数据是不变的。每个类型占用的字节长度不一样,所以用不同类型读出来会不一样,还涉及大小端的问题。你读 8 个连续地址的 char 打印出来,你再读一个 int 出来,然后用计算器转换 int 为 16 进制,看看你发现了什么?
    msg7086
        8
    msg7086  
       2023-10-02 13:00:12 +08:00
    不包含类型的地址指针是 void*无类型指针。有类型指针……当然有类型了。
    PTLin
        9
    PTLin  
       2023-10-02 14:19:32 +08:00
    位 + 上下文
    sakura6264
        10
    sakura6264  
       2023-10-02 15:04:51 +08:00
    指针做下强制类型转换就变成按别的类型读数据了
    YuJianrong
        11
    YuJianrong  
       2023-10-03 05:57:17 +08:00
    学习和理解指针的最佳办法,就是去读编译出来的汇编指令。
    C 语音读 O0 的汇编指令是很容易的。
    Ricciardo
        12
    Ricciardo  
       2023-10-03 12:19:24 +08:00
    啊这
    awolf
        13
    awolf  
       2023-10-03 13:44:15 +08:00
    和蒋公微操模式类似
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1034 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:57 · PVG 03:57 · LAX 11:57 · JFK 14:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.