Re: typedefと関数ポインタ
新城@筑波大学情報です。こんにちは。
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 も、日本語(逆ポーランド)ものもがあると、結合に関して
はもっと分かりやすいと思うんだけど、どこかにないですかね。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735