转换/类型转换Int指针指向char指针,但获取ascii字符?

时间:2016-03-11 17:18:04

标签: c++ c pointers

所以我正在阅读C / C ++指针的教程,导师进行类型转换

他说,对于C,将一个从int指针指向char指针的地址可以这样做:

int f = 1025;
int *point = &f;
char *point3;
point3 = (char*)point;

我这样做但是我得到了一张笑脸和Diamond acsii图片(以img链接显示)。

所以我尝试使用reinterpret_cast<char*>(point),因为我查了一下#34;也许这就是C ++等价物&#34;,现在它看起来像这样:

int f = 1025;
int *point = &f;
char *point2;
point2 = reinterpret_cast<char*>(point);

但我仍然得到两个有趣的acsii角色。

我错过了什么吗?不知道如何解决这个问题,因为我刚刚从指针章节开始。

整个计划

#include <iostream>


using namespace std;
int main(){

int f = 1025;
int *point = &f;
cout << sizeof(f) << endl;
cout << "value" << *point << "address" << point << endl;
char *point2;
point2 = reinterpret_cast<char*>(point); // using method i found
char *point3;
point3 = (char*)point; // using method given in the tutorial
cout << endl;
cout << "value" << *point2 << "address" << point2 << "   "<< point3 << endl;

system("pause");
return 0;
}

enter image description here

The Tutorial i was following

2 个答案:

答案 0 :(得分:1)

始终看到char*的值的原因是运算符&lt;&lt;的行为。此运算符将char*视为c字符串,而不是地址。

如果您要打印地址,请将其投放到(void*)

 cout << (void*) point2;

我希望我很清楚,我理解你的问题。

答案 1 :(得分:0)

是的,当你说

point3 = (char*)point

您正在将整数指针point转换为字符指针point3point用于指向整个整数(当然是多字节数量),而point3可以指向单个字节。

所以现在point3指向point指向的单个字节,换句话说,指向构成整数f的字节。

但重要的是,字节本身不会以任何方式改变。通过使用不同类型的指针,我们可以不同地查看字节,但同样,字节不会改变。

如果我们说

printf("%d\n", *point);

我们取整数指针point,获取它指向的int,然后打印它。所以我们当然会看到&#34; 1025&#34;。

如果我们说

printf("%02x %02x\n", *point3, *(point3 + 1));

我们正在使用point3来获取和打印两个单独的字节。我们可能会看到类似&#34; 01 04&#34;的内容。这是什么意思? 好吧,十六进制(基数为16)的数字1025是0x401,所以我们选择了两个字节0x010x04来构成它。

(你可能想知道为什么两个字节看起来像是&#34;错误的顺序&#34;,这是因为常见的&#34;小端&#34;表示,这是另一天的故事。但如果你使用的是32位整数的大端机器,你会看到&#34; 00 00&#34;,你会更加困惑。)

那么为什么你会得到笑脸和钻石?我不确定,但这些可能是您机器上值为1和4的字符。你可能试图将它们打印为字符,而不是像我那样打印十六进制值。

最后,您可能已经认为通过&#34;将一个int指针转换为一个char指针&#34;你可以以某种方式将整数转换为字符串。但是,不,你没有做那样的事情。

是的,在C中,字符指针(char *)通常用于表示字符串。但这并不意味着通过将某些内容转换为char *,您将其转换为字符串。 (同样,你所有的转换都是指针。)

组成值1025的字节始终为0x040x01。将它们转换为十进制字符串(在C中)的唯一方法是调用printf并使用%d,或调用非标准函数,如itoa()。或者,在C ++中,您可以使用<<