2010-04-01 70 views

回答

27

它们作为指针传递。这意味着关于数组大小的所有信息都将丢失。您最好建议使用std :: vectors,它可以按照您的选择通过值或引用传递,因此保留所有信息。

下面是一个将数组传递给函数的示例。注意,我们必须明确指定元素的数量,因为sizeof(p)会给出指针的大小。

int add(int * p, int n) { 
    int total = 0; 
    for (int i = 0; i < n; i++) { 
     total += p[i]; 
    } 
    return total; 
} 


int main() { 
    int a[] = { 1, 7, 42 }; 
    int n = add(a, 3); 
} 
+0

感谢Neil,但正如我在昨天的一篇文章中提到的,我目前正在从TC++ PL开发excersizes,并且我必须使用oridinary数组。我只是想知道是否有必要写下如下内容:void f(int(&a)[size]);还是仅仅将它声明为不带ref的数组就足够了。 – 2010-04-01 11:12:33

+0

因此,通过这个答案判断他们传递的值是一个指针的大小。我对吗? – 2010-04-01 11:14:01

+1

@atch从TC++ PL,恕我直言,不从C++学习的好理由。 – 2010-04-01 11:14:22

5

数组是特殊的:它们总是作为指针传递给数组的第一个元素。

23

首先,您不能在数组副本的意义上按值传递数组。如果您需要该功能,请使用std::vectorboost::array

通常情况下,通过值传递指向第一个元素的指针。该过程中数组的大小会丢失,并且必须单独传递。下面的签名都是相同的:

void by_pointer(int *p, int size); 
void by_pointer(int p[], int size); 
void by_pointer(int p[7], int size); // the 7 is ignored in this context! 

如果你想通过引用传递,大小类型的一部分:

void by_reference(int (&a)[7]); // only arrays of size 7 can be passed here! 

你经常用的模板参考合并过程,这样你就可以使用具有不同静态已知尺寸的功能:

template<size_t size> 
void by_reference(int (&a)[size]); 

希望这会有所帮助。