2010-04-01 74 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]); 

希望這會有所幫助。