2014-01-14 69 views
0
//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函数参数中的A和A []有什么区别?

当我们通过参数,我们不应该通过这样的...

fillRandArray(A[MAX_STUDENTS], number, 44); <---- ??? 
+0

这里看看:http://stackoverflow.com/questions/1790704/difference-between-方括号和星号 – prajmus

回答

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

如果我没有解释得不够好的话,可以问更多的问题。

+0

谢谢,所以数组通过引用传递?因为它不需要* – Joshua

+0

是的,我相信数组在C++中通过引用传递。引用表示对实际数组的引用(即井地址)传递给函数,而不是通过值传递,这只是一个副本。如果你不想在你的函数中改变数组,你可以将const放在数组的前面。 – MrPickle5

+1

数组的名称是__not__地址。 –

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远preferrable。)

相关问题