所以我正在阅读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;
}
答案 0 :(得分:1)
始终看到char*
的值的原因是运算符&lt;&lt;的行为。此运算符将char*
视为c字符串,而不是地址。
如果您要打印地址,请将其投放到(void*)
:
cout << (void*) point2;
我希望我很清楚,我理解你的问题。
答案 1 :(得分:0)
是的,当你说
时point3 = (char*)point
您正在将整数指针point
转换为字符指针point3
。 point
用于指向整个整数(当然是多字节数量),而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
,所以我们选择了两个字节0x01
和0x04
来构成它。
(你可能想知道为什么两个字节看起来像是&#34;错误的顺序&#34;,这是因为常见的&#34;小端&#34;表示,这是另一天的故事。但如果你使用的是32位整数的大端机器,你会看到&#34; 00 00
&#34;,你会更加困惑。)
那么为什么你会得到笑脸和钻石?我不确定,但这些可能是您机器上值为1和4的字符。你可能试图将它们打印为字符,而不是像我那样打印十六进制值。
最后,您可能已经认为通过&#34;将一个int指针转换为一个char指针&#34;你可以以某种方式将整数转换为字符串。但是,不,你没有做那样的事情。
是的,在C中,字符指针(char *
)通常用于表示字符串。但这并不意味着通过将某些内容转换为char *
,您将其转换为字符串。 (同样,你所有的转换都是指针。)
组成值1025的字节始终为0x04
和0x01
。将它们转换为十进制字符串(在C中)的唯一方法是调用printf
并使用%d
,或调用非标准函数,如itoa()
。或者,在C ++中,您可以使用<<
。