如何:在c ++上使用点击指针

时间:2014-01-21 15:00:45

标签: c++ pointers typecasting-operator

我正在学习类型转换。

这是我的基本代码,我不知道为什么在进行类型转换后,在打印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;
}

3 个答案:

答案 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::coutchar*一起用作参数,期望以空字符结尾的字符串。相反,你用它喂它的是一个指向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);