“BYTE”和“PBYTE”是做什么用的?我在互聯網上找不到任何資訊。
#include <iostream>
#include <Windows.h>
using namespace std;
BYTE by='a';
PBYTE pby= &by;
int main(){
cout<<"by : "<<by<<endl;
cout<<"&by : "<<&by<<endl; // Why doesn't it return the memory address?
cout<<"pby : "<<pby<<endl;
cout<<"&pby: "<<&pby;
return 0;
}
The console shows:
by : a
&by : a
pby : a
&pby: 00007FF6CC10A008
我只想知道 BYTE 和 PBYTE 的用途。我無法理解。謝謝
uj5u.com熱心網友回復:
BYTE,PBYTE 在 Windows 編程中是非常古老的風格。例如,如果你想為你的影像加載器分配堆記憶體,你可以寫
unsigned char* img = new unsigned char[1024 * 1024];
load_image(img, ....);
conv_image(img, ....);
但是你的手指會很累,所以你可以寫
PBYTE img = new BYTE[1024 * 1024];
是的,微軟在 20 多年前發明了這些定義的型別。但它不可移植,不遵循標準,導致記憶體泄漏,所以在 21 世紀,你應該如下所述撰寫。
auto img = make_shared<uint8_t>(1024 * 1024);
or
vector<uint8_t> v(1024 * 1024);
or
array<uint8_t, 1024 * 1024> a; // need enough stack memory
uj5u.com熱心網友回復:
“BYTE”和“PBYTE”是做什么用的?我在互聯網上找不到任何資訊。
請看這里。
BYTE A byte (8 bits).
This type is declared in WinDef.h as follows:
typedef unsigned char BYTE;
PBYTE
A pointer to a BYTE.
This type is declared in WinDef.h as follows:
typedef BYTE *PBYTE;
還有std::byte,其中記錄:
std::byte 是一種獨特的型別,它實作了 C 語言定義中指定的位元組概念。與 char 和 unsigned char 一樣,它可用于訪問其他物件占用的原始記憶體(物件表示),但與那些型別不同,它不是字符型別,也不是算術型別。一個位元組只是位的集合,并且只為它定義了位運算子。
uj5u.com熱心網友回復:
“BYTE”和“PBYTE”是干什么用的?
BYTE是 的型別別名unsigned char并且PBYTE是 的型別別名BYTE *, aka unsigned char *. 它們在 WINAPI 中與它們的“真實”型別相同 -unsigned char以及指向unsigned char
在您的代碼中:
cout << "&by : ";
cout << "&phy : ";
將在記憶體中獲取該字串文字的指標,并列印出后面的所有字符,直到它到達 a \0(以空結尾的字串如何作業)。然后,它回傳 a basic_ostream<char, _Traits>&,允許您鏈接多個呼叫。
當您呼叫時cout << &by,您正在呼叫多載運算子 for basic_ostream << const unsigned char *__s。如果您深入研究代碼,
template<typename _Traits> inline basic_ostream<char, _Traits>&
operator<<(basic_ostream<char, _Traits>& ___out, const unsigned char* __s)
{
return (___out << reinterpret_cast<const char*>(__s));
}
您會發現 is 所做的只是將其轉換const unsigned char*為 a const char*(注意 a 是如何的unsigned char*,const因為它是一個全域變數)。換句話說,它的作業方式與 完全相同cout << reinterpret_cast<const char*>(&by),程式將您&by視為以空字符結尾的字串。由于堆疊上的分配被重置為\0s,因此by它與一個字符長的以空字符結尾的字串 ( "a\0") 相同。
另一方面,當您呼叫 時cout << &pby,您正在呼叫多載運算子 for __ostream_type& << const void*。由于( )PBYTE *沒有多載,因此程式將 轉換為 void 指標。在這種情況下,它只是簡單地列印出 的地址。PBYTE *BYTE **pby
__ostream_type& operator<<(const void* __p) {
return _M_insert(__p);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/532620.html
標籤:C 视窗温纳皮字节
