メモリの大部分、たとえば10MBを手動で割り当てたとします。
この地域の真ん中に数ビットを保存したいと思います。
その場所のメモリをどのように取得しますか?
生のメモリにアクセスすることを私が知っている唯一の方法は、配列表記を使用することです。
また、割り当てられたメモリは大きな配列と見なすことができるため、配列表記はそのために適切に機能します。
// Set the byte in the middle to `123`
((char *) memory_ptr)[5 * 1024 * 1024] = 123;
char
ポインターが別のタイプの場合に備えて、ポインターに型キャストします。すでにchar
ポインタである場合、型キャストは必要ありません。
1ビットのみを設定する場合は、メモリを8000万個の個別のビットを持つ巨大なビットフィールドと見なします。必要なビット、たとえばビット番号40000000を見つけるには、最初にそれが含まれているバイトを見つけ、次にビットを見つける必要があります。これは、通常の除算(文字を見つけるため)とモジュロ(ビットを見つけるため)で行われます。
int wanted_bit = 40000000;
int char_index = wanted_bit / 8; // 8 bits to a byte
int bit_number = wanted_bit % 8;
((char *) memory_ptr)[char_index] |= 1 << bit_number; // Set the bit
配列表記は、ポインターを記述するもう1つの方法です。これを使用することも、次のように直接ポインタを使用することもできます。
char *the_memory_block = // your allocated block.
char b = *(the_memory_block + 10); // get the 11th byte, *-operator is a dereference.
*(the_memory_block + 20) = b; // set the 21st byte to b, same operator.
memcpy
、、、およびその他も、次のように非常に役立つ場合がありmemzero
ますmemmove
。memcmp
char *the_memory_block = // your allocated block.
memcpy(the_memory_block + 20, the_memory_block + 10, 1);
もちろん、このコードも同じです。
char *the_memory_block = // your allocated block.
char b = the_memory_block[10];
the_memory_block[20] = b;
そしてこれもそうです:
char *the_memory_block = // your allocated block.
memcpy(&the_memory_block[20], &the_memory_block[10], 1);
また、一方は他方より安全ではなく、完全に同等です。
配列表記があなたの答えになると思います...ビットシフト演算子<<および>>をANDおよびORビットマスクとともに使用して、特定のビットにアクセスできます。
配列表記を使用することも、ポインター演算を使用することもできます。
char* buffer = new char[1024 * 1024 * 10];
// copy 3 bytes to the middle of the memory region using pointer arithmetic
//
std::memcpy(buffer + (1024 * 1024 * 5), "XXX", 3);
C / C ++では、配列は最初の要素へのポインターとして扱われます。したがって、配列名は最初の要素のエイリアスにすぎません。
*pName is equivalent pName[0]
その後:
*(pName+1) == pName[1];
*(pName+2) == pName[2];
等々。括弧は、優先順位の問題を回避するために使用されます。それらを使用することを決して忘れないでください。
コンパイル後、どちらの方法も同じように動作します。私は読みやすさのために括弧表記を好みます。