理解:从int地址转换为char数组

时间:2011-11-03 05:04:10

标签: c++

这条线到底做了什么?

(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'? ,等十字标志...

4 个答案:

答案 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的指针。然后,您可以使用该指针一次读取一个整数的字节。