演算子を使用して、変数または関数のメモリアドレスを見つけることができることを知っています&
。しかし、何かがメモリ位置にあることがわかっている場合、どうすればそれ2
にアクセスできますか?
たとえば、へのポインタを宣言すると、メモリ アドレスではなく、2
値として読み取られます。2
2
ポインターにキャストするだけです。
int *pointerToTwo = (int *)2;
その後、通常どおり逆参照できます。
int valueAtTwo = *pointerAtTwo;
この種のことを行う通常の理由は、メモリにマップされたレジスタにアクセスすることです。その場合、次のvolatile
キーワードを使用することをお勧めします。
int valueAtTwo = *(volatile int *)2;
または、すべてのキャストをマクロに貼り付けて、コードを読みやすくすることもできます。
#define intValueAt(x) (*(volatile int)(x))
int valueAtTwo = intValueAt(2);
余談です 2
が、この使用例では、ほぼ確実に有効なアドレスではありません。あなたの質問であなたの参照のためにそれを使用しました。
void* pMemory = (void*)2L;
これにより、void*
(voidポインター)が作成され、そのアドレスがに設定されます2
。
プロセスがそのメモリにアクセスしてはならない場合(メモリから読み取る権限がない場合)、これによりあらゆる種類のエラーが発生する可能性があることに注意してください。また、アドレスをランダムに読み取ってはならないことにも注意してください。ポインタを使用してメモリ位置に直接アクセスすると、エラーが発生しやすくなります。これが、ソフトウェア開発者が、正しい予想されるデータ型を使用して、正しい状況下で正しいメモリアドレスにのみアクセスするのに役立つ多くのテクノロジを開発した理由です。
次のように、単に int* にキャストしてポインターを取得できます。
int *ptr = (int *)2;
その後、通常の * 演算子で 2 の内容にアクセスできます。
int i = *ptr;
あなたが望むことをします。
ただし、実際には、上記の「i」は RAM の 2 番目のセルの実際の内容ではないことに注意してください。これは、ユーザー モード アプリケーションでは、'2' が常に仮想アドレスとして扱われ、(実行時に) 物理アドレスに変換されるためです。通常、Unix ライクな OS のユーザー モード コードでそのようなことを行う方法はありません。