将 c 变量作为数组访问
Access c variable as an array
我有点卡住了,谷歌搜索正确的词无法让我找到正确的答案。更糟糕的是,我已经这样做了,但我自己的代码示例丢失在源代码的某处。
#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]);
}
基本上我需要通过指针算法通过数组访问各个可变字节,无需任何计算,只需通过类型转换。
它在 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;
在您的演员阵容中加上括号:
printf("%x %x\n", ((char *)&x)[0], ((char *)&x)[1]);
请注意,字节顺序可能会改变您的预期结果。
以后用-Wall
编译看看有什么警告或错误。
如果您只关心获取 值,您可以将源变量的地址存储在 char *
中并递增和取消引用 char
打印每个字节值的指针。
引用 C11
,章节 §6.3.2.3
[....] When a pointer to an object is converted to a pointer to a character type,
the result points to the lowest addressed byte of the object. Successive increments of the
result, up to the size of the object, yield pointers to the remaining bytes of the object.
类似于(考虑伪代码,未测试)
#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
的类型没有按预期更改。因此,为了强制使用有意义的类型转换,我们需要将其括在额外的括号中。
我有点卡住了,谷歌搜索正确的词无法让我找到正确的答案。更糟糕的是,我已经这样做了,但我自己的代码示例丢失在源代码的某处。
#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]);
}
基本上我需要通过指针算法通过数组访问各个可变字节,无需任何计算,只需通过类型转换。
它在 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;
在您的演员阵容中加上括号:
printf("%x %x\n", ((char *)&x)[0], ((char *)&x)[1]);
请注意,字节顺序可能会改变您的预期结果。
以后用-Wall
编译看看有什么警告或错误。
如果您只关心获取 值,您可以将源变量的地址存储在 char *
中并递增和取消引用 char
打印每个字节值的指针。
引用 C11
,章节 §6.3.2.3
[....] When a pointer to an object is converted to a pointer to a character type, the result points to the lowest addressed byte of the object. Successive increments of the result, up to the size of the object, yield pointers to the remaining bytes of the object.
类似于(考虑伪代码,未测试)
#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
的类型没有按预期更改。因此,为了强制使用有意义的类型转换,我们需要将其括在额外的括号中。