コンピュータ内のすべてのデータはメモリに配置する必要があります。たとえば、intは4バイトを取り、charは1バイトを取ります。これらのデータに正しくアクセスするには、ハウス番号とID番号のように、各バイトに番号を付ける必要があります。各バイト番号は一意であり、特定のバイトは番号に基づいて正確に見つけることができます。
図4Gは、(16進数)の各バイト数のメモリである:
我々は、メモリアドレス(アドレス)またはバイト数と呼ばれるポインタ(ポインタ)。アドレスは0から順に増加します。32ビット環境の場合、プログラムは4GBのメモリを使用でき、最小アドレスは0、最大アドレスは0XFFFFFFFFです。
次のコードは、住所を出力する方法を示しています。
- #include <stdio.h>
- int main (){
- int a = 100 ;
- char str [ 20 ] = "c.biancheng.net" ;
- printf ("%#X、%#X \ n " 、&a 、str );
- 0を返します。
- }
操作結果:
0X28FF3C、0X28FF10 %#X
は、接頭辞付きの16進形式の出力を意味します0X
。aは変数であり、整数を格納するために使用され&
ます。アドレスを取得するには、前に追加する必要があります。str自体は文字列の最初のアドレスを表すため、追加する必要はありません&
。
C言語では、制御文字がある%p
16進形式でアドレスを調達に特化し、しかし、%p個の出力フォーマットは、いくつかのコンパイラで、一様ではない0x
ので、ここで私たちが使用していなかった、いくつかのなしで、接頭辞。
すべてが住所です
C言語では、変数を使用してデータを格納し、関数を使用して再利用可能なコードを定義します。これらの変数は、最終的にCPUで使用するためにメモリに配置する必要があります。
データとコードの両方がバイナリ形式でメモリに格納され、コンピュータはメモリの一部にデータとコードのどちらが格納されているかをフォーマットで区別できません。プログラムがメモリに読み込まれると、オペレーティングシステムは異なるメモリブロックに異なるアクセス許可を割り当てます。読み取りおよび実行アクセス許可を持つメモリブロックはコードですが、読み取りおよび書き込みアクセス許可(読み取りアクセス許可のみを持つ場合があります)メモリブロックはデータです。
CPUはアドレスを介してメモリ内のコードとデータのみを取得でき、プログラムの実行中に、CPUは実行されるコードと読み書きされるデータのアドレスを通知されます。プログラムが誤ってエラーを作成した場合、または開発者が意図的にエラーを作成した場合、CPUがデータを書き込みたいときに、コード領域にアドレスを指定すると、メモリアクセスエラーが発生します。この種のメモリアクセスエラーは、ハードウェアとオペレーティングシステムによってインターセプトされ、プログラムを強制的にクラッシュさせ、プログラマーは救いのチャンスがありません。
CPUがメモリにアクセスするときは、変数名や関数名ではなくアドレスが必要です。変数名や関数名は単なるニーモニックアドレスであり、ソースファイルをコンパイルして実行可能プログラムにリンクすると、アドレスに置き換えられます。コンパイルとリンクのプロセスの重要なタスクは、これらの名前に対応するアドレスを見つけることです。
メモリ内の変数a、b、cのアドレスがそれぞれ0X1000、0X2000、0X3000であるとすると、加算演算c = a + b;
は次のような形式に変換されます。
0X3000 =(0X1000)+(0X2000);
( )
値の操作を表します。式全体は、アドレス0X1000と0X2000の値を取得してそれらを追加し、その加算結果をアドレス0X3000のメモリ
変数名と関数名に割り当てることを意味します。コードを記述するプロセスでは、読みやすく理解しやすい英語の文字列を使用できます。バイナリアドレスに直接直面する必要はありません。
変数名、関数名、文字列名、配列名は基本的に同じですが、すべてアドレスのニーモニックですが、コードの作成過程では、変数名はデータ自体を表すと考えられます、および関数名、文字列名、配列名は、コードブロックまたはデータブロックの最初のアドレスを表します。