[英]why i am getting output blank?
為什么我的輸出空白? 指針可以修改但無法讀取。為什么?
#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;
}
[Desktop]👉 g++ test_pointer.cpp
[Desktop]👉 ./a.out
@ @
16843009
我想通過使用char的指針類型來讀取integer的值。 這樣我就可以逐字節讀取。
您正在流char
。 IOStreams *會自動為您提供ASCII碼的這些字符,因此您看到(或更確切地說,沒有看到) 不可打印的字符 (實際上是所有0x01字節)。
您可以將其int
轉換為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
那些說您的程序未定義的說法是錯誤的(假設您的int
至少包含四個字節); 特別允許通過char*
對象起別名。
16843009
輸出正確; 等於0x01010101
,如果將流設置為十六進制模式,則會再次看到該值。
注意:有些人會建議使用reinterpret_cast<char*>(&a)
和static_cast<int>(*x1)
,而不是C樣式的強制類型轉換,盡管在我個人看來,在這種特殊情況下它們很丑陋且不必要。 對於輸出,您至少可以編寫+*x1
來獲得對int
的“免費”升級(通過一元+
運算符),但這並不是非常自我記錄。
*從技術上講,情況與此相反; IOStreams 通常會自動將您的數字,布爾值和其他內容轉換為正確的ASCII字符,以在屏幕上正確顯示。 對於char
,假設您已經提供了所需的ASCII值,它將跳過該步驟。
假設int
在您的系統上至少有4個字節長,則程序將操縱int a
的4個字節。
結果16843009
是十進制值0x01010101
,所以這是您所期望的。
您不會在輸出的第一行看到任何內容,因為您寫入了4個二進制值1
(或0x01
)的字符,它們是不可見的字符(ASCII SOH)。
當您像這樣修改程序時
*x1='1';
*x2='3';
*x3='5';
*x4='7';
您將看到帶有預期字符的輸出
@1 3 5 7@
926233393
值926233393
是的十進制表示0x37353331
其中0x37
是字符的ASCII值'7'
等
(這些結果對於小端架構是有效的。)
看看你對x
的聲明
char *x1,*x2,*x3,*x4;
這些是指向chars
(字符)的指針。
在流輸出中,它們被解釋為可打印字符。 仔細查看ascii-Table,您會發現較低的數字不可打印。
由於您的int a
為零,因此指向各個字節的x
也為零。
獲得可讀輸出的一種可能性是將字符轉換為int
,以便流將打印數字表示形式而不是ascii字符:
cout <<"@" << int(*x1) << " " << int(*x2) << " " << int(*x3) << " " << int(*x4) << "@"<<endl ;
如果我正確理解了您的問題,這就是解決方案
#include <stdio.h>
#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 <<"@" << (int)*x1 << " " << (int)*x2 << " " << (int)*x3 << " " << (int)*x4 << "@"<<endl ;
cout << a << endl;
}
您可以使用一元+將字符類型(打印為符號)轉換為整數類型(打印為數字):
cout <<"@" << +*x1 << " " << +*x2 << " " << +*x3 << " " << +*x4 << "@"<<endl ;
查看積分促銷 :
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.