//function prototype at the top
void fillRandArray(int A[], int number, int maxNum);
//function declaration
void fillRandArray(int* A, int number, int maxNum) {
for(int i = 0; i < number; i++) {
A[i] = rand() % maxNum + 1;
}
}
int A[MAX_STUDENTS];
fillRandArray(A, number, 44);
我不理解代码,因此原型集int A[]
然后是声明集int* A
当我们通过论证时,我们不应该这样传递......
fillRandArray(A[MAX_STUDENTS], number, 44); <---- ???
答案 0 :(得分:2)
下面的代码是传递数组的名称,这是一个地址。
void fillRandArray(int A[], int number, int maxNum);
下面的代码只是传递一个地址的名称,在这种情况下恰好是A.他们基本上做同样的事情。
void fillRandArray(int* A, int number, int maxNum)
您不会像下面这样传递参数:
fillRandArray(A[MAX_STUDENTS],..., ...);
因为你告诉编译器期望一个地址,而不是数组的一个元素。所以你只需要传递它A(即数组的名称,也是起始地址)。所以它看起来像这样:
fillRandArray(A, number, 44);
如果我没有充分解释,请提出更多问题。
答案 1 :(得分:1)
问题是C样式数组不能作为参数传递
一个功能。当您将int a[]
作为参数写入时
一个函数,编译器将其转换为int* a
。在
另外,如果您提供维度(例如int a[10]
),则为
简单地忽略了
此外,一个数组可以转换为一个指针,并将进行很多
上下文。这就是fillRandArray(A, number,
44)
中发生的事情;数组A
隐式转换为指针。
至于fillRandArray(a[MAX_STUDENTS], number, 44)
,这个
索引到第一个元素的数组;跟你的
声明,它传递int
(不是数组或指针),
除了它访问超出数组末尾的那个,所以它是
未定义的行为。
一般情况下,您希望避免这种情况(尽管使用main
,您
不能):该函数应该采用std::vector<int>&
a
,或者在一些特殊情况下采用int (&a)[N]
(在这种情况下,
该函数应该是一个模板,N
是一个模板
参数)。所以你可以写:
template <size_t N>
void fillRandArray( int (&a)[N], int maxNumber )
{
for ( int i = 0; i != N; ++ i ) {
a[i] = rand() % maxNum + 1;
}
}
(但是对于这种事情,std::vector
更受青睐。)