【C言語】ポインタ(15)規格書での記載③ ~へのポインタ 

どうも。gochaです。

まずは、C言語の規格書に記載されているポインタについてから。

- ポインタ型は、被参照型と呼ばれるファンクション型、オブジェクト型、またはインコンプリート型から派生され得る。

ポインタ型はオブジェクトの特徴を説明し、このオブジェクトの値は、被参照型の実体への参照となる。

被参照型Tから派生されるポインタ型は、時々、“Tへのポインタ”と呼ばれる。

被参照型からポインタ型を構築することは、“ポインタ型の派生”と呼ばれる。

“ポインタ型の派生”は再帰的に適用することができる。

参照(英語):http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf#page=48

今回は、上記3つ目の「被参照型Tから派生されるポインタ型は、時々、“Tへのポインタ”と呼ばれる」について、前回使用したコードを使って説明します。

再掲:“int 型へのポインタの型”となるポインタ型と、“char 型へのポインタの型”となるポインタ型にアドレスをアサインし、インクリメントし、表示するプログラム。pointer-type.c

#include <stdio.h>

int main (void){

        char a;
        int b;
        char * pa;
        int * pb;

        a = 10;
        b = 10;

        pa = &a;
        pb = &b;

        printf(" The value of a = %d\n", a);
        printf(" The value of b = %d\n", b);
        printf(" The contents of pa , char *, = %p\n", pa);
        printf(" The contents of pb , int  *, = %p\n", pb);

        pa++;
        pb++;

        printf(" The contents of pa++, char *, = %p\n", pa);
        printf(" The contents of pb++, int  *, = %p\n", pb);

        return 0;
}

行7を見ると、pa のポインタ型は、char 型から派生されれています。ので、pa のポインタ型は、char へのポインタと言われます。

同じように、行8を見ると、pb のポインタ型は、int 型から派生されれています。ので、pb のポインタ型は、int へのポインタと言われます。

ようやくここで、ポインタという言葉の使い方の定義らしきものが出てきました。ここからは、自分が勝手に思っていることですが、規格書にもともと、

ポインタとはXXである。

と、いうような定義がしっかりされていれば、ここまでポインタは分かりづらいものにならなかっただろうと考えています。残念ながら規格書ではそうは定義されませんでした。

もしかすると優秀な先人、偉人達は、規格書に続く自身が書いた書籍等で、厳密さを無視して言い切ることを優先したのかもしれません。

結果として、上記に当てはまらない例が頻発しました。そして新人Cプログラマが純粋な向学心に基づき、そして先輩等なら正確に理解しているはずという過大評価に基づいて、「ポインタってなんですか?」という質問をすると、何かしら答えなければいけない先輩は、

ググれカス

というか、

要は、ポインタは、変数のアドレスを格納する変数だよ、ほら、本にも書いてあるだろ?

と対応してきて今日に至っているのではと考えてます。

もし貴方が、新人に「ポインタって何ですか?」と聞かれたら、間違ってもググれカスと言わないでください。

このブログを始めとして、

ポインタが理解できないのは、理解できない人の責任でなく、ポインタについて間違った情報が氾濫しすぎている現状が悪い

ということを明確に言い切っているリソースに出会える確率はとっても少ないです。

そのため、「ポインタってなんですか?」と聞かれたら、最低でも下記を教えてあげてください。

ポインタってなんですか?

  • 多くの本とかWeb上のリソースでは、「ポインタは、変数のアドレスを格納する変数」と説明されているケースが多くて、そういう使い方をすることもあるが、そうじゃない使い方もあるから言いきるのは難しい
  • 例えば、一言で言い切るのが難しい証拠として前橋 和弥氏の本のように、ポインタで一冊本が書けてしまうぐらいのテーマである
  • こんな状況になってるのは、自分のせいでも、もちろん君のせいでもないので、都度理解していけば大丈夫
  • どうしても言い切らなければいけない場合で、皆さんがこの理解に同意していただける場合は、「gocha っていう人はポインタはC言語で表現されたプログラムに存在する ❝さまざまなもの❞ にアクセスするための仕組みと理解しているよ」と伝えてあげてください。

以前にもご紹介した、前橋 和弥氏著の書籍はこちら↓

C言語ポインタ完全制覇(標準プログラマーズライブラリ)前橋 和弥 (著)

今回はここまで。

!!! All copyrights in this article belong to the writer of this blog.