[英]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]);
}
基本上,我只需要通过类型转换就可以通过指针算术通过数组访问各个变量字节,而无需进行任何计算。
在演员表上加上括号:
printf("%x %x\n", ((char *)&x)[0], ((char *)&x)[1]);
请注意,字节序可能会更改您的预期结果。
将来,请使用-Wall
进行编译,以查看警告或错误。
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;
如果只想获取值 ,则可以将源变量的地址存储在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;
}
应该这样做。
也就是说,为详细说明已接受的答案, 为什么部分:
根据运算符优先级表 ,数组索引运算符的优先级高于类型转换,因此,除非在表达式中明确强加,
(char *)&x[0]
x
的类型未按预期更改。 因此,要强制使用类型转换的有意义的用法,我们需要将其括在括号中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.