7
int (*ptr)(char (*ch)[]);

上記の宣言は何を意味しますか? ということですか

ptr は、整数を返す文字へのポインターの配列である引数を受け入れる関数へのポインターですか?

どのように評価するのですか?

4

4 に答える 4

2

あなたが書いたように、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) {
    //...
}
于 2013-06-11T01:06:30.050 に答える