将c变量作为数组访问

时间:2017-01-01 07:27:32

标签: c arrays pointers pointer-arithmetic

我已经适度地陷入困境,谷歌搜索正确的单词无法让我找到正确的答案。更糟糕的是,我已经做到了,但我自己的代码示例在源代码中遗失了。

#include <stdio.h>

int main()
{
    short x = 0xABCD;
    char y[2] = { 0xAB, 0xCD };
    printf("%x %x\n", y[0], y[1]);
    printf("%x %x\n", (char *)&x[0], (char *)&x[1]);
}

基本上我需要通过指针算法通过数组访问单个变量字节,无需任何计算,只需通过类型转换。

3 个答案:

答案 0 :(得分:3)

在演员周围加上括号:

printf("%x %x\n", ((char *)&x)[0], ((char *)&x)[1]);

请注意,endian-ness可能会改变您的预期结果。

将来,使用-Wall进行编译,以查看警告或错误是什么。

答案 1 :(得分:1)

在C99中有所支持。通过一个称为通过联合的类型惩罚的过程。

union {
  short s;
  char c[2];
} pun;

pun.s = 0xABCD;
pun.c[0] // reinterprets the representation of pun.s as char[2].
         // And accesses the first byte.

指针转换(只要它是char*,以避免严格的别名违规)也没问题。

short x = 0xABCD;
char *c = (char*)&x;

答案 2 :(得分:1)

如果您只是为了获取而烦恼,可以将源变量的地址存储在char *中并递增和取消引用char指针以进行打印每个字节的值。

引用C11,章节§6.3.2.3

  

[....]当指向对象的指针转换为指向字符类型的指针时,   结果指向对象的最低寻址字节。连续增量   结果,直到对象的大小,产生指向对象剩余字节的指针。

类似的东西(考虑伪代码,未经过测试

#include  <stdio.h>

int main(void)
{
    int src = 0x12345678;
    char * t = &src;

    for (int i = 0; i < sizeof(src); i++)
        printf("%x\t", t[i]);

    return 0;
}

应该这样做。

那说,要详细说明接受的答案, 为什么 部分:

根据operator precedence table,数组索引运算符的优先级高于类型转换,因此除非明确强制,否则在表达式中

  (char *)&x[0]

x的类型未按预期更改。因此,为了强制使用类型转换,我们需要将它括在额外的括号中。