こんにちは。

On 25 Nov 2003 16:54:29 GMT
yas@is.tsukuba.ac.jp (Yasushi Shinjo) wrote:

> たとえば、下の3つのうち、2つは同じなんですけど、ど
> れだかわかりますか。
> 
>      int *f();
>      int (*f)();
>      int *(f());

intへのポインタを返す関数fのプロトタイプ宣言
int *f();
int *(f());

intを返す関数へのポインタfの宣言
int (*f)();

でしょうか。
さんざん関数ポインタのことを調べた直後だったのでこっちはすんなり
わかりましたが、下のほうがわかりませんでした。

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

調べたところ、

charへのポインタを5つ格納できる配列cの宣言
char *c[5];
char *(c[5]);

charを5つ格納できる配列への、ポインタcの宣言
char (*c)[5];

でしょうか。

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;
もできないですね。
配列の先頭要素のアドレスと、
配列そのもののアドレス(?)は違うものみたいですね。
いまいちよくわからないです。

多次元配列(配列の配列...?)と関係あるような気がしますが。