为什么最后两个print语句在类型转换指针'ptr'之后不打印任何内容?

zip*_*ock 3 c++ pointers

我想看看将整数指针转换ptr为字符指针后会发生什么ptr0。但是,最后两个打印语句不会将任何输出打印到控制台。

#include <iostream>
using namespace std;

int main(void)
{
    int var  = 1025;
    int *ptr = &var;

    //~ addr of var
    cout << ptr << endl;

    //~ value of var - dereferencing 
    cout << *ptr << endl;

    char *ptr0;

    //~ typecasting int to char
    ptr0 = (char*)ptr; // also tried: ptr0 = (char*)&var

    cout << ptr0 << endl;
    cout << *ptr0 << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出显示:

0x7ffd6d8f4b94
1025
Run Code Online (Sandbox Code Playgroud)

预期结果:

0x7ffd6d8f4b94
1025

0x7ffd6d8f4b94
1
Run Code Online (Sandbox Code Playgroud)

seb*_*ckm 5

这两行都打印出一些东西。但是,这种“东西”是无法打印的。

在C ++中char*被认为是字符串。因此,与其他所有指针类型不同,它cout不会告诉您a所char*存储的地址,而是会将其所指向的内存解释为chars 的空终止数组。同样,这是因为char*在C ++中得到了特殊的对待。在您的情况下,您1025(或0x00000401十六进制)存储的内存如下所示:

01 04 00 00
Run Code Online (Sandbox Code Playgroud)

如果您ptr0指出这一点,它将指向01。由于它是a,char*因此将其解释为长度为2的字符串:第一个字符为01,第二个字符为,04然后有一个00确定结尾的字符串。查看ASCII表,我们看到那些字符引用了一些不可打印的字符(我从零到一点都不知道它们(曾经)有什么用)。因此,cout除了以下内容外,不输出任何内容endl

cout << *ptr0 << endl; 另一方面,将仅打印该字符串的第一个字符,而该字符又不能打印。

如果要打印地址和数字而不是字符串和字符,则必须将它们分别强制转换回其他指针和整数,例如:

cout << (void*)ptr0 << endl;
cout << (int)*ptr0 << endl;
Run Code Online (Sandbox Code Playgroud)

在这里查看它如何打印您的预期结果。

  • 在过去,。0x01和0x04用于串行通信SOH标头开始和EOT传输结束,在不同协议中使用。 (2认同)