2013-02-18 88 views
5

我想知道當我傳遞一個數組作爲參數時,哪一個是最好的?數組作爲參數

void function(int arr[]) {...}; 

void function(int* arr) {...}; 

你能告訴我你的理由嗎?你可能會提及哪本書?謝謝!

+0

當你傳遞一個數組來運行它時,它會衰減爲指向數組的第一個元素的指針。所以兩者都是相同的。 – 2013-02-18 08:24:06

+0

在這些之外? 'void function(std :: string const&str){...};'最好。 – Johnsyweb 2013-02-18 08:34:20

+0

推薦閱讀:http://stackoverflow.com/a/4810672/78845 – Johnsyweb 2013-02-18 08:36:31

回答

4

由於這個問題被標記,我會用也沒有。如果您使用必須使用,兩者都是等效的。

但既然你用C++,更好的方法是使用std::vector此類任務

void function(std::vector<int> &arr) {...} 

,或者,如果你不修改數組/矢量

void function(const std::vector<int> &arr) {...} 
1

它們在語義上是相同的。

#1稍微好一些(在我看來),因爲它明確表示你正在傳遞一個數組。

+3

他們是_syntactically_不同。它們在語義上是相同的。 – 2013-02-18 08:18:36

+0

我必須承認,我更喜歡#2,但不是因爲它明確表示你傳遞了一個數組;我更喜歡它,因爲它明確表示你正在傳遞一個**地址** = P – WhozCraig 2013-02-18 08:36:20

0

傳遞一個數組作爲參數,最好的辦法居然是:

void function(type_t* array, int amountOfElts, int arrayAllocatedElts);

對於某些情況下(如通過字符串時),你可以經常跳過這兩個參數。但是它們可能有用,例如對字符串進行一些操作時,或者可以爲您節省一兩次。

在函數參數中使用[]選項在我看來令人困惑,應該避免。但我不認爲這是一個慣例。

3

如果你只是想傳遞任何數組(包括動態分配),它們是等價的。

如果您的功能需要一個實際的固定大小的數組,你可以這樣做:

template <size_t N> 
void function(char (&str)[N]) { ... } 
1

你問哪個選擇的

void function(int arr[]) {...}; 

void function(int* arr) {...}; 

後者允許你聲明指針本身爲const,而前者只允許你聲明這些項目爲const。然而,讀者[]表示一個數組,而不是可能指向單個對象的指針。我個人認爲const提供的約束比[]提供的array'ness指示更實用。

對於更高級別的代碼,請使用std::vectorstd::array,以較合適的爲準。

0

根據要提供抽象層上,你應該奧拉夫的方法什麼的STL使用到較高水平之間進行選擇:

template <class Iter> 
void function(Iter first, Iter last) 
{ 
    // for example, to get size: 
    std::size_t size = std::distance(first, last); 
    // for example, to iterate: 
    for (Iter it = first; it != last; ++it) 
    { 
     // *it to get the value, like: 
     std::cout << *it << std::endl; 
    } 
} 

這樣一來,就可以使用該功能不僅爲數組,但對於各種STL類型:矢量,列表,隊列,堆棧等等。

int tab[4] = {1,2,3,4}; 
function(tab, tab+4); 

std::vector<int> vec; 
// fill vector with something 
function(vec.begin(), vec.end());