С++ передаёт указатель массива как аргумент функции
Я пытаюсь использовать указатели массивов для использования в качестве аргументов для функции, которая генерирует массив.
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*)'
Ответы
Ответ 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;
}