为什么我的输出空白?

1 c++ pointers

为什么我的输出空白?指针可以修改但无法读取。为什么?

#include <iostream>
using namespace std;

int main(){
    int a = 0;
    char *x1,*x2,*x3,*x4;
    x1 = (char *)&a;
    x2 = x1;x2++;
    x3 = x2;x3++;
    x4 = x3;x4++;
    *x1=1;
    *x2=1;
    *x3=1;
    *x4=1;

    cout <<"@" << *x1 << " " << *x2 << " " << *x3 << " " << *x4 << "@"<<endl ;
    cout << a << endl;
}
Run Code Online (Sandbox Code Playgroud)
[Desktop] g++ test_pointer.cpp
[Desktop] ./a.out
@   @
16843009
Run Code Online (Sandbox Code Playgroud)

我想通过使用char的指针类型来读取integer的值。这样我就可以逐字节读取。

Lig*_*ica 6

您正在流式传输char。IOStreams *会自动为您提供ASCII码的这些字符,因此您看到(或更确切地说,没有看到)不可打印的字符(实际上是所有0x01字节)。

您可以强制转换int为查看数值,也可以添加std::hex为常规视图。

例:

#include <iostream>
#include <iomanip>

int main()
{
    int a = 0;

    // Alias the first four bytes of `a` using `char*`
    char* x1 = (char*)&a;
    char* x2 = x1 + 1;
    char* x3 = x1 + 2;
    char* x4 = x1 + 3;

    *x1 = 1;
    *x2 = 1;
    *x3 = 1;
    *x4 = 1;

    std::cout << std::hex << std::setfill('0');
    std::cout << '@' << std::setw(2) << "0x" << (int)*x1
              << ' ' << std::setw(2) << "0x" << (int)*x2
              << ' ' << std::setw(2) << "0x" << (int)*x3
              << ' ' << std::setw(2) << "0x" << (int)*x4
              << '@' << '\n';
    std::cout << "0x" << a << '\n';
}

// Output:
//   @0x01 0x01 0x01 0x01@
//   0x1010101
Run Code Online (Sandbox Code Playgroud)

现场演示

那些说您的程序未定义的说法是错误的(假设您的程序int中至少有四个字节);char*明确允许通过别名对象。

16843009输出是正确的; 0x01010101如果您将流设为十六进制模式,则等于再次看到该值。


注意:有些人会推荐reinterpret_cast<char*>(&a)static_cast<int>(*x1),而不是C样式的强制类型转换,尽管我个人觉得它们在这种特殊情况下很丑陋且不必要。对于输出,您至少可以编写+*x1int(通过一元运算+符)获得“免费”升级,但这并不是非常自我记录。


*从技术上讲,情况与此相反;IOStreams 通常会自动将您的数字,布尔值和其他内容转换为正确的ASCII字符,以在屏幕上正确显示。对于char它跳过这一步,假设你已经在提供你想要的ASCII值。