【发布时间】:2012-03-20 04:36:08
【问题描述】:
我最近做了一个使用位掩码和移位来操作 4 字节 int 的作业。
我想知道是否可以设置一个指向 int 变量开头的 char 指针,然后使用 char 指针逐步遍历 int,就好像它是一个 1 字节的 char。
有没有办法做到这一点或类似的事情?我试图将 char 指针设置为一个 int,但是当我提前 1 步时,它会跳转 4 个字节。
只是想办法做同样的事情。
【问题讨论】:
我最近做了一个使用位掩码和移位来操作 4 字节 int 的作业。
我想知道是否可以设置一个指向 int 变量开头的 char 指针,然后使用 char 指针逐步遍历 int,就好像它是一个 1 字节的 char。
有没有办法做到这一点或类似的事情?我试图将 char 指针设置为一个 int,但是当我提前 1 步时,它会跳转 4 个字节。
只是想办法做同样的事情。
【问题讨论】:
当然可以,这段代码显示了行为:
#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 个字节,这是因为在将类型转换为较小类型的数据之后,已对指针进行了算术运算。
【讨论】:
char 指针可用于检查/访问其他类型。仅对char有效;其他指针类型不允许这样别名。
short* 并以 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];
【讨论】:
是的,一个 char 指针每次会步进 1 个字节,您可能无意中将其转换为 int。
另一个复杂性是 int 中字节的顺序,至少在 Intel 上是这样
【讨论】: