【问题标题】:pointers and memory addresses指针和内存地址
【发布时间】:2012-03-20 04:36:08
【问题描述】:

我最近做了一个使用位掩码和移位来操作 4 字节 int 的作业。

我想知道是否可以设置一个指向 int 变量开头的 char 指针,然后使用 char 指针逐步遍历 int,就好像它是一个 1 字节的 char。

有没有办法做到这一点或类似的事情?我试图将 char 指针设置为一个 int,但是当我提前 1 步时,它会跳转 4 个字节。

只是想办法做同样的事情。

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    当然可以,这段代码显示了行为:

    #include <stdio.h>
    
    int main()
    {
      int value = 1234567;
      char *pt = (char*) &value;
    
      printf("first char: %p, second char: %p\n", pt, pt+1);
    }
    

    这个输出:

    first char: 0x7fff5fbff448, second char: 0x7fff5fbff449
    

    如您所见,差异仅为预期的 1 个字节,这是因为在将类型转换为较小类型的数据之后,已对指针进行了算术运算。

    【讨论】:

    • 啊,我知道我现在哪里出错了。需要进行适当的铸造才能使其工作。现在有道理了。谢谢杰克/mfrankli/马丁
    • “当然”有点夸张。这实际上并不明显,它是 C 语言保证的一个特殊属性,char 指针可用于检查/访问其他类型。仅对char有效;其他指针类型不允许这样别名。
    • 不,对其他类型有效。我可以将其转换为 short* 并以 2 个字节乘以 2 个字节导航它们。我说当然是因为强制转换只会迫使编译器认为一个类型是我想要的,如果我出错了,这会导致错误,但我没有限制。
    【解决方案2】:

    我想这应该做你想做的:

    int x = 42;
    char *c = (char *) &x;
    char byte0 = c[0];
    char byte1 = c[1];
    char byte2 = c[2];
    char byte3 = c[3];
    

    【讨论】:

      【解决方案3】:

      是的,一个 char 指针每次会步进 1 个字节,您可能无意中将其转换为 int。

      另一个复杂性是 int 中字节的顺序,至少在 Intel 上是这样

      【讨论】:

        猜你喜欢
        • 2020-07-03
        • 1970-01-01
        • 1970-01-01
        • 2013-12-22
        • 1970-01-01
        • 1970-01-01
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多