C++ passer un pointeur de tableau en tant qu'argument de fonction

J'essaie d'utiliser des pointeurs de tableaux à utiliser comme arguments pour une fonction qui génère un tableau.

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

Mais quand je compile ce message apparaît:

cannot convert `int (*)[5]' to `int**' for argument `1' to `void generateArray(int**, int*)'
29
demandé sur Benjamin Lindley 2012-08-06 18:01:03

5 réponses

Vous le compliquez trop-il doit juste être:

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;
}

Lorsque vous passer un tableau en paramètre à une fonction, il se désintègre à un pointeur vers le premier élément du tableau. Donc, il n'est normalement jamais nécessaire de passer un pointeur sur un tableau.

58
répondu Paul R 2012-08-06 16:28:59

int *a[], lorsqu'il est utilisé comme paramètre d'une fonction (mais pas dans la normale des déclarations), est un pointeur vers un pointeur, pas un pointeur vers un tableau (normal déclarations, c'est un tableau de pointeurs). Un pointeur vers un tableau ressemble à ceci:

int (*aptr)[N]

N est un entier positif particulier (pas une variable).

Si vous faites de votre fonction un modèle, vous pouvez le faire et vous n'avez même pas besoin de passer la taille du tableau (car elle est automatiquement déduite):

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);
}

Vous pourriez aussi prenez une référence:

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);
}
18
répondu Benjamin Lindley 2012-08-06 14:19:45

Vous n'avez pas besoin de prendre un pointeur sur le tableau pour le passer à une fonction de génération de tableau, car les tableaux se désintègrent déjà en pointeurs lorsque vous les transmettez à des fonctions. Il suffit de faire le paramètre int a[], et de l'utiliser comme un tableau régulier dans la fonction, les modifications seront apportées au tableau que vous avez passé.

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;
}

Comme note de côté, vous n'avez pas besoin de passer la taille par pointeur, car vous ne la modifiez pas à l'intérieur de la fonction. En outre, il n'est pas un bon l'idée de passer un pointeur constant vers un paramètre qui attend un pointeur non-constante.

5
répondu dasblinkenlight 2012-08-06 14:09:08

Je suppose que cela va aider.

Lorsqu'ils sont passés en tant qu'arguments de fonctions, les tableaux agissent de la même manière que les pointeurs. Donc, vous n'avez pas besoin de les référencer. Il suffit de taper: int x[] ou int x[a] . Les deux façons fonctionneront. Je suppose que C'est la même chose que Konrad Rudolf disait, compris autant.

0
répondu Crispin 2016-02-21 22:49:59
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;
}
-1
répondu wasim 2015-04-22 04:21:37