Подтвердить что ты не робот

С++ передаёт указатель массива как аргумент функции

Я пытаюсь использовать указатели массивов для использования в качестве аргументов для функции, которая генерирует массив.

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*)'
4b9b3361

Ответ 1

Вы слишком усложняете его - это просто должно быть:

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

Когда вы передаете массив в качестве параметра функции, он распадается на указатель на первый элемент массива. Поэтому обычно нет необходимости передавать указатель на массив.

Ответ 2

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

Ответ 3

Вам не нужно указывать указатель на массив, чтобы передать его функции генерации массива, потому что массивы уже распадаются на указатели, когда вы передаете их функциям. Просто введите параметр 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;
}

В качестве примечания стороны вам не нужно передавать размер указателем, потому что вы не меняете его внутри функции. Более того, не рекомендуется передавать указатель на константу в параметр, который ожидает, что указатель будет непостоянным.

Ответ 4

Я предполагаю, что это поможет.

При передаче в качестве аргументов функций массивы действуют так же, как указатели. Поэтому вам не нужно ссылаться на них. Просто введите:   int x[] или   int x[a] , Оба способа будут работать. Я предполагаю, что это то же самое, что говорил Конрад Рудольф, так много.

Ответ 5

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