函数参数中A和A []有什么区别?

时间:2014-01-14 18:12:03

标签: c++ parameters

//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); <---- ???

2 个答案:

答案 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更受青睐。)