2

私はC 上のポインターでこれを見つけます

int f[]();  /* this one is illegal */

と:

int (* f [])(); /* this one legal. */

私は本当に2番目のものの使い方を知りたい.

ありがとうございました。

4

4 に答える 4

2

初期化ブロックを使用する場合、2 番目の例は非常に有効です。: _

#include <stdio.h>
int x = 0;
int a() { return x++ + 1; }
int b() { return x++ + 2; }
int c() { return x++ + 3; }

int main() 
{
  int (* abc[])() = {&a, &b, &c};
  int i = 0,
      l = sizeof(abc)/sizeof(abc[0]);
  for (; i < l; i++) { 
    printf("Give me a %d for %d!\n", (*abc[i])(), i);
  }
  return 0;
}
于 2012-11-06T12:25:21.830 に答える
1
int f[]();  /* this one is illegal */

関数の配列を宣言しようとしていますが、これは不可能です。

int (* f [])(); /* this one NOT legal, despite what the OP's post says. */

これは、関数ポインタの配列を宣言しようとしています。これ、配列のサイズが指定されている場合、完全に合法的 (かつ合理的) です。たとえば、次のようになります。

int (* f [42])(); /* this one legal. */

編集:関数パラメーター型の場合、配列からポインターへの変換がすぐに行われるため、型は関数パラメーター型として使用int (* f [])() できます。つまり、a (おそらく多次元) の最も内側の配列の次元を指定する必要はありません。配列:

void some_func(int (* f [])());  /* This is also legal. */
于 2012-11-06T12:25:51.933 に答える
1

関数配列のサイズが不明であるため、2 番目の例が正しいかどうかはわかりませんが、本来あるべきものは関数ポインターの配列であり、サイズが次の場合の使用例を次に示します。既知:

int a()
{
    return 0;
}

int main(int argc ,char** argv)
{
    int (* f [1])();
    f[0] = a;
}
于 2012-11-06T12:16:59.120 に答える
1

int f[]();// 関数の配列を作成できないため、これは違法です。では違法ですC

しかし、2番目は合法です

int (* f [])();f は、int指定されていない数の引数を返したり受け取ったりする関数ポインターの配列であると言います

于 2012-11-06T12:19:01.887 に答える