为什么我的输出空白?指针可以修改但无法读取。为什么?
#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的值。这样我就可以逐字节读取。
您正在流式传输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样式的强制类型转换,尽管我个人觉得它们在这种特殊情况下很丑陋且不必要。对于输出,您至少可以编写+*x1以int(通过一元运算+符)获得“免费”升级,但这并不是非常自我记录。
*从技术上讲,情况与此相反;IOStreams 通常会自动将您的数字,布尔值和其他内容转换为正确的ASCII字符,以在屏幕上正确显示。对于char它跳过这一步,假设你已经在提供你想要的ASCII值。