char(*p)[15];
char(*p)(int *a);
int(*pt)(char*);
int *pt(char*);
を意味するものを得るいけませんか?私は、次のポインタ変数の宣言は、Cで誰が助ける
char(*p)[15];
char(*p)(int *a);
int(*pt)(char*);
int *pt(char*);
を意味するものを得るいけませんか?私は、次のポインタ変数の宣言は、Cで誰が助ける
*
を削除し、残っているものを確認することです3は関数プロトタイプよりも関数ポインタ(実際の 'typedef'キーワードを残して)のtypedefになりそうです。 4は関数プロトタイプですが、戻り値の型はint型ではなくint型です。 –
3は4と同じではありません。3は関数ポインタ、4は関数プロトタイプです。余分なかっこでは大きな違いがあります。 – thkala
4はintではなくintポインタを返します –
:
char p[15];
char p(int *a);
int pt(char*);
int pt(char*);
あなたが得るのは、あなたのポインタが指すタイプの変数宣言です。第4のケースでは、
int *pt(char*);
は有効なポインタ宣言ではありません。
EDIT:
理由は括弧なしで、関数呼び出し「演算子」はポインタ参照演算子よりも優先されるということです。上記の場合、平易な英語で宣言がある:
*pt
がその機能である:我々は、
int (*pt)(char *);
に変換しながらint *
を返すpt(char *)
機能を、
有しますchar *
を返し、int
を返します。
これは、基本的にはpt
がそのタイプへのポインタであることを意味します。
基本ルール:可能であれば、識別子から開始して、必要なときに読んでください。
)
を右に読んでください。あなたの「右足」を1文字右に置いてください。)
は、あなたが当てはまるものならそれです。
[42]
が表示されている場合は、「42の配列」と言ってください。(
になるまで左に読んでください。それがあなたが命中した場合は、左足を(
の左に1文字置きます。
*
または&
が表示される場合は、「ポインタ」または「参照先」と言ってください。const
、int
、MyFoo
)は、それだけです。*識別子がない場合は、どこに行かなければならないのか想像してください。私は知っていますが、法的な配置は1つだけです。これらの規則に従って
:
完全なルールセットを持つのは良いことですが、私はこのすべてのホッピングの後に私の足が傷つけることを認めなければなりません:-) – thkala
デコードする長い宣言があれば、タイトフィットのズボンを着ない方がいいです:) –
試しくださいhttp://cdecl.org/ – pmg