Tomitomi's blog

勉強したこと、やってみたことなどを書き連ねていく場

C言語のポインタとは何かを考えた

前置き

ゼミでポインタとは何かという話になって、その時に納得のいく説明ができていなかったので、自分なりに考えてみたことを書いてみました。

ポインタとは

wikipediaのポインタのページには「あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、それを参照する(指し示す)ものである。」1とあります。 簡潔にすると「変数を参照するのに必要十分な情報」ということかと思いました。 以下、「変数を参照するのに必要十分な情報」をポインタの定義として、C言語のポインタとは何かを考えたいと思います。

C言語のポインタ

C言語の場合、メモリー上の位置を指し示すものであるアドレスを用います。
C言語のほとんどの変数2はメモリー上にその値が保管されていて、 つまり変数の本体はメモリー上に存在するので、 変数の位置をアドレスで指し示すことができます。

しかし、アドレスだけでは変数を指し示すのに十分ではありません、 アドレスが指し示すのは変数のメモリー上での位置だけで、 そこにどんな変数が存在するかがわかりません。 つまり、そのアドレスにある変数の型の情報も必要です。

アドレスとそこにある変数の型がわかれば、変数を参照することができます。 つまり、C言語ではポインタとはアドレスと変数の型の組であるということになります。

以下に示すのはdouble型変数Aのポインタを取得して表示するプログラムとその実行結果です。

#include<stdio.h>

int main(){
    double A;
    printf("A's address is %p\n",&A);
    return 0;
}
A's address is 0x7ff592ec7f0

以上に示したようにポインタを表示すると0x7ff592ec7f0という整数値が表示されますが、これは変数Aのアドレスです。

表示されるものは単なる整数値ですが、&Aの型はint型ではなく、double*型です。

double * 型は中身自体は整数値(先の例だと0x7ff592ec7f0)ですが、double * 型という型であることで、この値がdouble型変数のアドレスであることを示しています。 アドレスとアドレス自身の型によってポインタが表現されていると考えることができます。

まとめ

ポインタを「変数を参照するのに必要十分な情報」と考えると、Cのポインタとはアドレスとそこに格納されている変数の型の組であり、アドレスとアドレス自身の型によってそれが表現されているという考えに至りました。