Top授業関係プログラミング言語2 → アドレスとポインタ
[前のページ] [目次] [次のページ]


4. アドレスとポインタ


4.1 メモリとアドレス

計算機は、色々な値をメモリ内に保存しています。

そして、メモリの単位で使用されるのは、bit と byte です。 1bit に 0 または 1 の値を1つ保存できます。 1bit が 8 つ集まる(つまり 8bit)で 1byte となります。 計算機は基本的に、この 1byte を基準として扱います。

計算機内には、1byte を保存することができるものが大量にあることになります。 そして、それらには、0 から順に番号が振られています。これをアドレスと言います。

メモリとアドレスの概念図

4.2 アドレスの参照

C言語では、変数に値を保存することができます。たとえば、整数型(int型)の変数ならば整数を保存することができるし、文字型(char)型の変数なら文字を保存することができます

これらの変数ですが、計算機の中では、当然、メモリ上に保存されます。 メモリ上のどこに保存されるのかは、OSやコンパイラが、適時行ってくれます。

C言語では、「変数がメモリ上のどこに保存されているのか」を、プログラム内で参照することができます。このことを利用することにより、色々な便利な機能を実現しています。

たとえば、

#include <stdio.h>

main(){
   int i;
}

というプログラムがあったとします。 プログラム中で、整数型の変数 i が宣言されています。 この i が、どこに保存されているかを参照するには、&i とします。

つまり、

『変数の前に & をつけると、その値をどこに保存しているか(アドレス)を参照できる』

となります。

『どこに保存されているか』はわかりました。次にやりたいことは、『その場所に入っている値が何か』かを知ることです。これは、C言語では * で行います(算術演算の乗算と同じ記号ですが、混同しないようにしましょう)。

今度は、

『アドレスの前に * をつけると、そのアドレスに保存している値を参照できる』

となります。


4.3 ポインタとアドレス

C言語にはポインタというものがあります。 ポインタというのは何かというと、アドレスを保存している変数です。 C言語では、このポインタを型として宣言することができます。

また、このポインタは、整数型や文字型と会わせて宣言されます。 つまり、『変数 poi はアドレスである』という形で宣言するのではなく、 『変数 poi は整数型の変数を保存しているアドレス』 『変数 poi は文字型の変数を保存しているアドレス』という風に、 どの型の変数を保存しているアドレスなのかを区別します。

次の例を見てみましょう。

#include <stdio.h>

main(){
   int i;
   int *poi_01;
   int arr[10];
}

この例では、i と *poi_01 は、整数であることを宣言しています。 さらに、arr[10] はサイズ10の整数型の配列であることも宣言しています。

『*アドレス』だと、そのアドレスに保存されている値を参照できました。 では、*poi_01 の poi_01 だけだと、何でしょうか?。 実は、poi_01 は『整数型の値を保存している変数のアドレス』になります。

このように、C言語でポインタを宣言するときは、宣言するときに * をつけてやります。こうすることで、C言語は、* の次の文字(この例だと poi_01)は、アドレスであると理解してくれます。

さらに、配列 arr[10] の arr は、配列の最初の要素(つまり、arr[0])のアドレスとなります。

この例の場合をまとめると、次のようになります。

アドレスを参照するには 値を参照するには
int i &i i
int *poi poi *poi
int arr[10] arr arr[0]

今回は整数型のポインタをやりましたが、 違う型についても、同様にポインタを宣言できます。


目次に戻る
授業関係のページに戻る