C言語でのメモリ空間とアドレスに関して、実際に試しながら解説します。
以下のプログラムを書いてみましょう。
#include <stdio.h>
 
int main(){
    int a,b;    //整数a,bを定義   
    a = 10,b = 20;   //aに10,bに20を代入
    printf("aのアドレス:%p\n",&a);   // &を付けることで、aのアドレスを表示する。
    printf("bのアドレス:%p\n",&b);   //pはアドレス(ポインタ)を表示する場合に指定する。
 return 0;
}
非常に簡単なプログラムで、整数a、bを定義し、それぞれ10と20という値を入れます。
この値は、パソコンのメモリ空間上に保存されます。
このとき、これらのaやbの値が、どこに保存したかを管理しておく必要があります。そこで、メモリにはアドレス(住所)があります。
では、これらaやbの値が、メモリ空間上のどこに保存されているかを表示するのが上記のプログラムです。
では、このプログラムを実行してみましょう。

C:\C>gcc -o pointer main.c

C:\C>pointer.exe
aのアドレス:0028FF2C
bのアドレス:0028FF28
1行目でコンパイルし、作成されたpointer.exeを実行すると、aのアドレスが「0028FF2C」でbのアドレスが「0028FF28」であることが分かります。
メモリ空間上では、以下のようになっています。
a
このように、int型ではメモリ上の4つ分の領域を確保します。