我正在尝试使用数组指针作为生成数组的函数的参数。
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*)'
答案 0 :(得分:65)
你过于复杂 - 它只需要:
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;
}
当您将数组作为参数传递给函数时,它会衰减到指向数组第一个元素的指针。因此通常不需要将指针传递给数组。
答案 1 :(得分:18)
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);
}
答案 2 :(得分:6)
您不需要使用指向数组的指针,以便将其传递给数组生成函数,因为当您将数组传递给函数时,数组已经衰减到指针。只需创建参数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;
}
作为旁注,您不需要通过指针传递大小,因为您没有在函数内部更改它。此外,将指向常量的指针传递给期望指针为非常量的参数并不是一个好主意。
答案 3 :(得分:0)
我猜这会有所帮助。
当作为函数参数传递时,数组的行为与指针相同。所以你不需要引用它们。只需输入:
int x[]
要么
int x[a]
。两种方式都有效。我想康拉德鲁道夫说的话也是如此,想得太多了。
答案 4 :(得分:-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;
}