Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

「char型へのポインタの配列」と「char型の配列へのポインタ」について

スポンサードリンク

f:id:fa11enprince:20200517102705j:plain
C言語で混乱しやすいのはポインタの表記ですね。
次の2つを見てみましょう。

char *foo[10];
char (*bar)[10];

このとき、fooとbarは意味が違います。
どちらかが
「char型へのポインタの要素数10の配列」
でもう一方が
「要素数10のchar型の配列へのポインタ」
です。

答えは
char *foo[10];が「char型へのポインタの要素数10の配列」
char (*bar)[10];が「要素数10のchar型の配列へのポインタ」
です。
ぱっと見逆のような気がしますが、次のような規則で解釈します。
Cの演算子の優先順位は*と[]について下記のようになっています。
優先順位は数字が小さいほうが優先度が高いです。

優先順位 演算子 名称 結合性
1 [] 添え字演算子 左結合
2 * 単項*演算子(間接演算子) 右結合

注:右結合、左結合とは同じ優先順位の演算子が続いたときの演算の順序のこと。
このルールに従えば次のように解釈できます。

char *foo[10];

型名 char*[10]
1. []が最優先なのでfooは「何か」の「要素数10の配列」
   Foo is an array (10 elements) of something. 
2. 「何か」は「char型へのポインタ」
   Something is a pointer to char.
3. よってfooは「char型へのポインタ」の「要素数10の配列」
   Foo is an array (10 elements) of a pointer to char.

char (*bar)[10];

型名 char(*)[10]
1. ()内が優先されるのでbarは「何か」への「ポインタ」
   Bar is a pointer to something.
2. 「何か」は「要素数10のchar型の配列」
   Something is an array of chars (10 elements).
3. よってbarは「要素数10のchar型の配列」への「ポインタ」
   Bar is a pointer to an array of chars (10 elements).

なおこういうのを調べるのに便利なcdeclというコマンドがあります。
UbuntuやCentOSにインストールできます。
Cygwinでも可能らしいけど……。

cdeclのrpm

http://pkgs.org/download/cdecl
http://www.filewatcher.com/m/cdecl-2.5-4.i686-cygwin.rpm.25298-0.html

Cygwin 64bit版ににcdecl入れようと思ったけどうまくいきませんでした。
途中でエラーになって断念しました。うーん。readlineがないとか言われるけど
readline7いれてもだめだしCygwinよくわかんね(^^;)

cdeclが実行できるサイト

http://www.cdecl.org/

上記サイトで

char (*(*x[3])())[5]

と打つと

declare x as array 3 of pointer to function returning pointer to array 5 of char 

と出ます。