C で変数を定義すると (つまり unsigned short int n = 5)、その値はユーザーの RAM のどこかにバイナリで格納されます (この場合、0000 0000 0000 0101 のようになります)。その値が格納される場所には、やはりバイナリのアドレスがあります。(つまり、値 5 は、たとえば 0010 に格納できます。これは、2 バイトを使用するため、ram で 0010 と 0011 の両方を使用することを意味します)。変数 n の名前は、その値が格納されているメモリ アドレスを表します。そのメモリアドレスはどこに保存されていますか?それはさらに多くのRAMを占有しませんか?もしそうなら、そのアドレスにもアドレスが必要ではないでしょうか?
2 に答える
変数のメモリアドレスは、メモリに直接保存されません。これは、変数にアクセスするコードの一部です。正確な状況に応じて、オフセット(既知の場所からの距離-たとえば、ローカル変数のスタックポインター、グローバル変数の場合はプログラムカウンター)または絶対アドレス(グローバル変数の場合のみ)のいずれかになります。
変数に変数のアドレスを格納させたい場合は、そうです。その変数用のメモリも必要です。このタイプの変数はポインターと呼ばれます。
割り当て方法 (スタックまたは静的)、変数へのアクセス方法など、いくつかの要因によって異なりますが、次のコードを想定してみましょう。
static int n = 5;
printf("%p\n", &n);
この場合、 のアドレスは、が呼び出されるn
コード セグメントに格納されます。printf
コードを逆アセンブルすると、 をpush
呼び出す直前にアドレスをスタックにプッシュする命令が見つかりますprintf
。プッシュされるアドレスはn
(プッシュされる 2 つのアドレスのうちの 1 つであり、フォーマット文字列もあります) のアドレスです。
上で述べたように、それは常に同じ方法であるとは限りません。異なるアーキテクチャとコンパイル フラグ (例: -fpic
) によって変更される場合があります。
また、変数がスタック上にある場合、または変数への参照がコードからではなくデータからのものである場合 (例: int n=5; int *p = &n;
)、状況が変わります。