不幸にも?C言語の複雑な宣言に出くわしてしまった場合、その宣言をどのようにして読み進めれば良いのでしょうか?
その手助けになるかも(あくまでも「かも」です(^_^; )しれないヒントを書きます。

【左側から読み進め、左側から読めない場合のみ右側から読む。】

これだけなの?と思われたかも知れませんが、たったこれだけです。
ヒントにそって読み進める例を、下記に記します。
一つずつ順番に読み進める感覚を、掴んでもらえたら幸いです。

「例1」 int **p[4]
int **p[4]
intへのポインタ *p[4]
intへのポインタへのポインタ p[4]
intへのポインタへのポインタの4要素配列 p

pは「intへのポインタへのポインタの4要素配列」です。

「例2」 int *(*p)[4]
int *(*p)[4]
intへのポインタ (*p)[4]
intへのポインタの4要素配列 (*p)
intへのポインタの4要素配列へのポインタ p

pは「intへのポインタの4要素配列へのポインタ」です。

「例3」 (int **[4])c (キャスト例)
c (int **[4])
c int **[4]
c intへのポインタ *[4] 
c intへのポインタへのポインタ [4]
c intへのポインタへのポインタの4要素配列

cをキャストした型は「intへのポインタへのポインタの4要素配列」です。

「例4」 (int *(*)[4])c (キャスト例)
c (int *(*)[4])
c int *(*)[4]
c intへのポインタ (*)[4] 
c intへのポインタの4要素配列 (*)
c intへのポインタの4要素配列へのポインタ

cをキャストした型は「intへのポインタの4要素配列へのポインタ」です。

*[4] と (*)[4] は異なる。(*)[4] の場合は右側から読む。

「例5」 int *(*(*const p)(void))(int)
int *(*(*const p)(void))(int)
intへのポインタ (*(*const p)(void))(int)
intへのポインタを返す関数(引数int) (*(*const p)(void))
intへのポインタを返す関数(引数int)へのポインタ (*const p)(void)
intへのポインタを返す関数(引数int)へのポインタを返す関数(引数無し) (*const p)
intへのポインタを返す関数(引数int)へのポインタを返す関数(引数無し)への不変ポインタ p

pは「intへのポインタを返す関数(引数int)へのポインタを返す関数(引数無し)への不変ポインタ」です。
 

コメント