「配列とポインタの完全制覇」

ここでは、「「配列とポインタの完全制覇」」 に関する記事を紹介しています。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
「配列とポインタの完全制覇」(1999/6/29 updated)
Cの配列、ポインタがらみの文法で、ハマりそうなポイントをまとめて下さっている。
しばらくCで書いてないときに、このサイトを読むことにした。


対象読者について

対象読者は、Cをそれなりに習得しており、かつ、 以下のような疑問を感じる人である。
Cの宣言では、[] は* よりも優先順位が高い。 ゆえに、char *s[10]; という宣言は、「char へのポインタの配列」を意味する ---逆じゃないか?
double (*p)[3]; や、void (*func)(int a);といった宣言の読み方がわからない。
int *a;は、a を「intへのポインタ」として宣言する。 しかし、式の中での * は、ポインタをポインタでなくする方に働く。 同じ記号なのに、意味が逆じゃないか?
int *a と int a[] は、どのような場合に置換可能なのか?
空の [] は、どのような場所で使用することができ、 どのような意味を持つのか?


Cでの宣言について

Cの宣言を解釈するには、以下の手順に従う。ここでは問題を簡単に するため const は考えない(constを考えた版は、 こちらへどうぞ)。
まず、識別子(変数名)に着目する。
識別子に近い方から、優先順位に従って派生型(ポインタ・ 配列・関数)を解釈する。優先順位は以下のようになっている。
宣言の一部をグループ化するための括弧
配列を意味する [], 関数を意味する()
ポインタを意味する *
派生型を解釈したら、それを"of"または"to"または"returning"で 連結する。
最後に、型指定子を追加する。
英語の苦手な人は、順序を逆にし、日本語で解釈する。

このように、Cの宣言は、(日本語・英語に関わらず)左から右に順に 読み進むことはできず、右に行ったり左に行ったりしなければならない。



演算子の優先順位について

この中で、優先順位が「最強」である ()について、
()は、プログラマが、文法で規定された優先順位を無視して 強制的に優先順位を設定する時に使用する括弧だ。だから、 これの優先順位が最強なのは当然だ。
と考えている人は意外に多いが、それは 間違いである。 もし、この ()がそのような意味なら、わざわざ優先順位表に載せる 必要はないはずである。
この表の() は、(K&Rにもあるように)関数呼出しを意味する 演算子であり、この場合の優先順位とは func(a, b) のような 関数呼出しにおいて、func と (a, b) との間の結び付きの強さを表現している。 Cでは、「関数へのポインタ」という型があり、以下のような記述が可能なので、 このような優先順位が必要なのである。



空の []について

Cでは、以下の場合、要素数を省略した[] を書くことができる。
以下のケースは全て、コンパイラによって特別に解釈されている。 これらの規則が一般に適用できると思わないこと。



文字列リテラルについて

" で囲まれた文字列を、文字列リテラルと呼ぶ。
通常は、文字列リテラルは、「char の配列」を意味する。 よって、式の中では「charへのポインタ」に読み換えられる。
しかし、char の配列を初期化する場合は例外である。 (こちらを参照のこと) この場合の文字列リテラルは、中括弧内に文字を区切って書く初期化子の 省略形として、コンパイラに特別に解釈される。




キャストについて
     宣言 → キャスト
double (*p)[3]; → (double (*)[3])
double *p[3]; → (double *[3])

(*) と * では意味が異なるので注意。


関数へのポインタについて

signal(SIGSEGV, segv_handler);
通常は、この書き方を使用すると思われる。
しかし、Cの宣言をここまでに述べた規則に基いて解釈すれば、 例えば int func(); という宣言において func は、 「int を返す関数」であり、func だけを取り出して「intを返す関数へのポインタ」に なるのは変である。関数へのポインタが必要なら、& を付けて & func としなければならない。そこで、上記のシグナルハンドラの設定を、
signal(SIGSEGV, &segv_handler);
と書いても、実は全く問題なく動作する。



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

商品詳細を見る







スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://tekitobibouroku.blog42.fc2.com/tb.php/152-8dce7666
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。