私はOSプロジェクトに取り組んでいますが、ポインタがメモリにどのように格納されているのか疑問に思っていますか?ポインタが4バイトであることを理解していますが、ポインタは4バイト間でどのように分散されますか?
私の問題は、4バイトのメモリスロットへのポインタを格納しようとしていることです。ポインタが0x7FFFFFFFであるとしましょう。4バイトのそれぞれに何が格納されていますか?
私はOSプロジェクトに取り組んでいますが、ポインタがメモリにどのように格納されているのか疑問に思っていますか?ポインタが4バイトであることを理解していますが、ポインタは4バイト間でどのように分散されますか?
私の問題は、4バイトのメモリスロットへのポインタを格納しようとしていることです。ポインタが0x7FFFFFFFであるとしましょう。4バイトのそれぞれに何が格納されていますか?
Endiannessを読んでください。ただし、通常、一度に 1 バイトのポインターだけを処理することはないため、バイトの順序は関係ありません。
更新: 既知の値で偽のポインターを作成し、その各バイトを出力する例を次に示します。
#include <stdio.h>
int main(int arc, char* argv[]) {
int *p = (int *) 0x12345678;
unsigned char *cp = (unsigned char *) &p;
int i;
for (i = 0; i < sizeof(p); i++)
printf("%d: %.2x\n", i, cp[i]);
return 0;
}
ポインタが格納される方法は、他のマルチバイト値と同じです。4 バイトは、システムのエンディアンに従って格納されます。4バイトのアドレスが以下であるとしましょう:
ビッグ エンディアン (最上位バイトが最初):
Address Byte
0x1000 0x7F
0x1001 0xFF
0x1002 0xFF
0x1003 0xFF
スモール エンディアン (最下位バイトが最初):
Address Byte
0x1000 0xFF
0x1001 0xFF
0x1002 0xFF
0x1003 0x7F
ところで、4 バイト アドレスは 32 ビット システムです。64 ビット システムには 8 バイトのアドレスがあります。
編集: ポインターの個々の部分を参照するには、ポインターを使用する必要があります。:) あなたが持っているとしましょう:
int i = 0;
int *pi = &i; // say pi == 0x7fffffff
int **ppi = π // from the above example, int ppi == 0x1000
単純なポインター演算では、各バイトへのポインターが得られます。