这条线到底做了什么?
(char*) (&input)
我知道它将int(输入)转换为char数组。或者我错了吗?你能指导我如何计算吗?
更新: 我想我现在明白了一点,然后我从你的评论中创建了c ++代码
#include <cstdlib>
#include <iostream>
using namespace std;
int main(){
int input = 123456;
int *p = &input;
char *cp = (char*)p;
for(int counter = 0;counter <sizeof(input); counter++){
cout << *(cp+counter) << endl;
}
system("pause");
return 0;
}
但我认为我的代码错了。因为它只显示'@',大'r'? ,等十字标志...
答案 0 :(得分:4)
它不会“转换”任何东西。你只是指向整数的第一个字节。
如果你的int
是32位(4字节),并且你有一个指向它的指针......
int myInt = 123456;
int *ptr = &myInt;
然后你将指针强制转换为char
指针......
char *cPtr = (char*)ptr;
现在你有一个指向整数第一个字节的字符指针。您可以通过以下方式单独查看每个字节:
int i;
for (i = 0; i < sizeof(int); i++)
{
printf("%d\n", *(cPtr+i));
}
请注意,char
已签名,因此某些字节可能会换行为负数。使用unsigned char
代替会改变这种行为。如果指针算术让您感到困惑,可以将*(cPtr+i)
替换为cPtr[i]
并获得相同的输出。
答案 1 :(得分:2)
它只是将input
的地址转换为指向char
的指针。你可能会看到一些略有不同的东西,如:
unsigned char *bytes = (unsigned char*)&input;
这对于读取input
地址的单个字节非常有用,因为char
的大小是一个字节。请注意,char
已签名,范围从-128到128,而unsigned char
(显然)是无符号的,更适合读取字节,因为它是无符号的,范围从0到255.
然后您可以读取特定的字节,如:
first_byte = bytes[0];
或者您可能想要设置特定的字节,例如:
bytes[0] = 0x7E;
答案 2 :(得分:1)
如果input
是一个整数,那么它会读取该地址的字节块,就好像它们是(可能已签名的)字符一样。
因此,如果输入的值为1234567890(忽略字节排序等细节),则char *将指向值0x49 0x96 0x02 0xD2
答案 3 :(得分:1)
它获取整数的地址(指向int的指针)并将指针转换为指向char的指针。然后,您可以使用该指针一次读取一个整数的字节。