V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
thomaswang
V2EX  ›  问与答

c 语言指针问题

  •  
  •   thomaswang · 2018-02-28 14:38:53 +08:00 · 1279 次点击
    这是一个创建于 2256 天前的主题,其中的信息可能已经有所发展或是发生改变。
    int main ( ){
        char * name = "123";
        name += 1;
        fprintf(stderr, "%c\n", *name);
        fprintf(stderr, "%c\n", name);
    
        return 0;
    }
    
    

    执行结果是: 2 R 多次编译,执行结果不变

    这两种打印,都是什么值

    6 条回复    2018-02-28 17:57:15 +08:00
    hx1997
        1
    hx1997  
       2018-02-28 15:41:22 +08:00 via Android
    2: name 里存的第二个字符
    R: name 里存的第二个字符所在内存地址的低字节(或者高?我忘了)所对应的 ASCII 字符
    hx1997
        2
    hx1997  
       2018-02-28 15:47:21 +08:00 via Android
    低还是高可能取决于小端序还是大端序?
    sbw
        3
    sbw  
       2018-02-28 15:47:34 +08:00
    第二句不变的原因是字符串存储在二进制的相同位置了,在前后增加其它内容,或者改变一下优化选项,name 所代表的字符串存储的相对位置就会改变,第二句的输出就会变化
    lance6716276
        4
    lance6716276  
       2018-02-28 16:25:57 +08:00 via Android
    2:123 的 2
    R:一个地址的按照%c 表示
    icedx
        5
    icedx  
       2018-02-28 17:00:50 +08:00
    看汇编应该更好理解

    装入*name

    mov eax, [esp+1Ch]
    movzx eax, byte ptr [eax]
    movsx eax, al
    mov [esp+4], eax

    装入 name

    mov eax, [esp+1Ch]
    mov [esp+4], eax
    thomaswang
        6
    thomaswang  
    OP
       2018-02-28 17:57:15 +08:00
    @icedx 厉害了,我的哥
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1986 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 01:28 · PVG 09:28 · LAX 18:28 · JFK 21:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.