不幸にも?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)へのポインタを返す関数(引数無し)への不変ポインタ」です。
その手助けになるかも(あくまでも「かも」です(^_^; )しれないヒントを書きます。
【左側から読み進め、左側から読めない場合のみ右側から読む。】
これだけなの?と思われたかも知れませんが、たったこれだけです。
ヒントにそって読み進める例を、下記に記します。
一つずつ順番に読み進める感覚を、掴んでもらえたら幸いです。
「例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)へのポインタを返す関数(引数無し)への不変ポインタ」です。
コメント