42

配列のポインタを使用して、配列を生成する関数の引数として使用しようとしています。

void generateArray(int *a[],  int *si){
  srand(time(0));
  for (int j=0;j<*si;j++)
       *a[j]=(0+rand()%9);
} //end generateArray;

int main() {
  const int size=5;
  int a[size];

  generateArray(&a, &size);

  return 0;
} //end main

しかし、これをコンパイルすると、次のメッセージが表示されます。

cannot convert `int (*)[5]' to `int**' for argument `1' to `void generateArray(int**, int*)'
4

5 に答える 5

91

あなたはそれを過度に複雑にしている-それはただある必要がある:

void generateArray(int *a, int si)
{
    for (int j = 0; j < si; j++)
        a[j] = rand() % 9;
}

int main()
{
    const int size=5;
    int a[size];

    generateArray(a, size);

    return 0;
}

配列をパラメーターとして関数に渡すと、配列の最初の要素へのポインターに減衰します。したがって、通常、配列へのポインタを渡す必要はありません。

于 2012-08-06T14:05:06.490 に答える
23

int *a[]、関数パラメーターとして使用される場合(通常の宣言では使用されません)、はポインターへのポインターであり、配列へのポインターではありません(通常の宣言では、ポインターの配列です)。配列へのポインタは次のようになります。

int (*aptr)[N]

N特定の正の整数(変数ではない)はどこにありますか。

関数をテンプレートにすると、それを実行でき、配列のサイズを渡す必要もありません(自動的に推定されるため)。

template<size_t SZ>
void generateArray(int (*aptr)[SZ])
{
    for (size_t i=0; i<SZ; ++i)
        (*aptr)[i] = rand() % 9;
}

int main()
{    
    int a[5];    
    generateArray(&a);
}

また、参照することもできます。

template<size_t SZ>
void generateArray(int (&arr)[SZ])
{
    for (size_t i=0; i<SZ; ++i)
        arr[i] = rand() % 9;
}

int main()
{    
    int a[5];    
    generateArray(a);
}
于 2012-08-06T14:12:59.540 に答える
7

配列を関数に渡すと、配列はすでにポインターに減衰するため、配列を生成する関数に渡すために配列へのポインターを取得する必要はありません。パラメータを作成し、int a[]それを関数内の通常の配列として使用するだけで、渡した配列に変更が加えられます。

void generateArray(int a[],  int si) {
    srand(time(0));
    for (int j=0;j<*si;j++)
        a[j]=(0+rand()%9);
}

int main(){
    const int size=5;
    int a[size];
    generateArray(a, size);
    return 0;
}

ちなみに、関数内でサイズを変更していないため、ポインタでサイズを渡す必要はありません。さらに、定数へのポインタを、非定数へのポインタを期待するパラメータに渡すことはお勧めできません。

于 2012-08-06T14:03:59.877 に答える
0

これが役立つと思います。

関数の引数として渡される場合、配列はポインターと同じように機能します。したがって、それらを参照する必要はありません。単に: int x[] または 。と入力しますint x[a] 。どちらの方法でも機能します。コンラート・ルドルフが言っていたのと同じことだと思います。

于 2016-02-21T22:49:59.220 に答える
-1
This is another method . Passing array as a pointer to the function
void generateArray(int *array,  int size) {
    srand(time(0));
    for (int j=0;j<size;j++)
        array[j]=(0+rand()%9);
}

int main(){
    const int size=5;
    int a[size];
    generateArray(a, size);
    return 0;
}
于 2015-04-22T04:21:37.633 に答える