新城@筑波大学情報です。こんにちは。

In article <20031126235045.C43D.INGRAM@os.rim.or.jp>
        Hyu-ga Hiroya <ingram@os.rim.or.jp> writes:
> > たとえば、下の3つのうち、2つは同じなんですけど、ど
> > れだかわかりますか。
> >      int *f();
> >      int (*f)();
> >      int *(f());
> intへのポインタを返す関数fのプロトタイプ宣言
> int *f();
> int *(f());
> 
> intを返す関数へのポインタfの宣言
> int (*f)();
> でしょうか。

はい。結局、f という名前に、* と () の2つが左右から付いた時
* には、右の () の方が結合度が強いということです。

> > 関数の括弧と結合どの括弧が混じっているので、さらにめちゃめちゃ
> > なんだけど。次の方がまだ優しいかな。
> >      char *c[];
> >      char (*c)[];
> >      char *(c[]);

これも同じですよ。結合度という意味では。f という名前に、* と 
[] の2つが左右から付いた時 * には、右の [] の方が結合度が強
いということです。

> char (*c)[5];
> char c5[5] = {'a', 'b', 'c', 'd', '\0'};
> char c6[6] = {'1', '2', '3', '4', '5', '\0'};
> c = &c5;
> は正しいですが、
> c = &c6;
> はできませんね。
> c = c5;
> もできないですね。

この場合、配列の要素数まで見てエラーチェックするんでしたっけ?

あと、cdecl というプログラムがあって、英語で説明してくれます。

------------------------------------------------------------
% ./cdecl
Type `help' or `?' for help
cdecl> explain char *c[];
declare c as array of pointer to char
cdecl> explain char (*c)[];
declare c as pointer to array of char
cdecl> explain char *(c[]);
declare c as array of pointer to char
cdecl> 

cdecl> explain int *f();
declare f as function returning pointer to int
cdecl> explain int (*f)();
declare f as pointer to function returning int
cdecl> explain int *(f());
declare f as function returning pointer to int
cdecl> 
------------------------------------------------------------

cdecl も、日本語(逆ポーランド)ものもがあると、結合に関して
はもっと分かりやすいと思うんだけど、どこかにないですかね。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\