int (*ptr)(char (*ch)[]);
上記の宣言は何を意味しますか? ということですか
ptr は、整数を返す文字へのポインターの配列である引数を受け入れる関数へのポインターですか?
どのように評価するのですか?
int (*ptr)(char (*ch)[]);
上記の宣言は何を意味しますか? ということですか
ptr は、整数を返す文字へのポインターの配列である引数を受け入れる関数へのポインターですか?
どのように評価するのですか?
あなたが書いたように、ptr
は を返す関数へのポインタでint
あり、引数として の配列へのポインタを取りますchar
。
ただし、配列に境界のない配列へのポインターを持つことはできません。したがって、変数が正しく指定されておらず、コンパイルされません。ptr
任意のサイズの配列を取ることができる関数へのポインターを受け入れることができる型が必要なようです。これには、テンプレートの構築が必要です。関数の引数の場合、次の形式になります。
template <unsigned N>
int foo (int (*ptr)(char (*)[N])) {
//...
}
通常、そのような型を単純化する方法はtypedef
、複雑な部分を表すために を使用することです。これにより、変数自体が何らかの型への単純なポインターになります。これは、関数ポインターを返す関数を作成しようとするときに特に役立ちます。
void x (char *s) {}
typedef void xtype (char *);
void (* y_hard ())(char *) { return x; }
xtype * y_easy () { return x; }
ただし、関数の引数のパラメーター化された性質により、それを実現するのが難しくなります。C++ 11を想定すると、次の構成を使用できます( this answer のおかげで):
template <unsigned N>
using ArrayArg = const char [N];
template <unsigned N>
using Function = int (ArrayArg<N> *);
template <unsigned N>
int foo (Function<N> *ptr) {
//...
}