我正在学习类型转换。
这是我的基本代码,我不知道为什么在进行类型转换后,在打印p0
时,它没有显示a
我知道这是非常基本的。
#include <iostream>
using namespace std;
int main()
{
int a=1025;
cout<<a<<endl;
cout<<"Size of a in bytes is "<<sizeof(a)<<endl;
int *p;//pointer to an integer
p=&a; //p stores an address of a
cout<<p<<endl;//display address of a
cout<<&a<<endl;//displays address of a
cout<<*p<<endl;//display value where p points to. p stores an address of a and so it points to the value of a
char *p0;//pointer to character
p0=(char*)p;//typecasting
cout<<p0<<endl;
cout<<*p0;
return 0;
}
答案 0 :(得分:3)
当您将char *
指针传递给<<
的{{1}}运算符时,它会打印指针指向的字符串,而不是地址。它与以下代码的行为相同:
std::cout
在您的情况下,const char *str = "Hello!";
cout << str; // Prints the string "Hello!", not the address of the string
未指向字符串,这就是您遇到意外行为的原因。
答案 1 :(得分:2)
operator<<
的重载与std::cout
和char*
一起用作参数,期望以空字符结尾的字符串。相反,你用它喂它的是一个指向int*
的指针。当尝试在char*
中输出cout<<p0<<endl;
时,这会导致未定义的行为。
在C ++中,使用C风格的强制转换通常是一个坏主意。例如,如果您使用了static_cast
,则would have been warned表示您尝试进行的转换没有多大意义。确实,您可以使用reinterpret_cast
代替,但您应该问自己的是:我为什么要这样做?为什么我要试着用脚射击自己?
如果您想要将数字转换为字符串,则应使用other techniques代替。如果您只想打印出应该使用的char*
地址std::addressof
:
std::cout << std::addressof(p0) << std::endl;
答案 2 :(得分:1)
正如其他人所说,cout将char *解释为字符串,而不是指针
如果你想证明地址是相同的指针类型,那么你可以将它转换为无效指针
cout<<(void*)p0<<endl;
事实上,除了char&amp;
之外,您还可以获得几乎任何类型的地址cout<<(float*)p0<<endl;
为了向自己证明char *指针具有相同的值,请使用printf
printf("%x", p0);