2010-02-20 73 views
7

假設我有一個數組返回數組在C++中

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

我有功能

int& function(int arr[]) 
{ 
//rest of the code 
     return arr; 
} 

我在做什麼在這裏錯?

+2

爲什麼你(或者任何開發人員)寫這個瘋狂的代碼? :\ – kennytm 2010-02-20 14:22:05

+0

@ manugupt1:它的意圖是將數組作爲副本傳遞給函數嗎? – 2010-02-20 17:29:42

回答

7
int& function(int arr[]) 

在此功能中ARR是一個指針,而且也沒有辦法再次打開它到一個數組。這是一樣的

int& function(int* arr) 

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

假設功能設法返回數組的引用,這仍然是行不通的。你不能分配給一個數組。在最好的情況,你可以將結果綁定到「X整數數組的基準」(使用一個typedef,因爲語法將變得非常難看,否則):

typedef int ten_ints[10]; 

ten_ints& foo(ten_ints& arr) 
{ 
    //.. 
    return arr; 
} 

int main() 
{ 
    int arr[10]; 
    ten_ints& arr_ref = foo(arr); 
} 

但是,它是完全不清楚的代碼在你的問題應該實現。對函數中的數組所做的任何更改對調用者都是可見的,所以沒有理由嘗試返回數組或將其分配回原始數組。


如果要一個固定大小的數組可以分配到和通過值傳遞(與被複制的內容),有std::tr1::array(或boost::array)。 std::vector也是一個選項,但這是一個動態數組,因此不是一個確切的等價物。

1
  • 作爲參數的數組實際上是一個指針。如果以參數
  • 作爲參數給出指針,數組將被自動「轉換」爲指針您不能將數組指定給C/C++中的另一個數組。您將不得不使用memcpy或循環來複制值。
  • 如果函數改變了arr參數,它實際上改變了調用者給出的arr變量的值。再次因爲數組實際上是一個指針。所以在調用者arr被分配給arr,這在這裏沒用。
4

數組傳遞和返回的語義可能相當混亂。改用std :: vector。

+0

或boost :: array(如果可用)。 – Macke 2010-02-20 13:27:40

+9

雖然這當然是好建議,但它甚至不能遠程回答問題** .. – 2010-02-20 13:58:29

+0

@Andreas「我在這裏犯了什麼錯誤?」 - 不使用矢量的錯誤。 – 2010-02-20 13:59:43

3

您正在返回對int的引用,而不是對數組的引用。

你想:

(int*)& function(int arr[]) 
{ 
    /// rest of the code 
    return arr; 
} 

儘管如此,正如其他人已經說過,這不是好的做法。

+3

實際上,它返回一個指針的引用,而且'arr'也不是一個數組。 – 2010-02-20 13:56:23

+1

除了@gf所說的,這也是一個語法錯誤。 – 2010-02-20 17:34:56

0

那麼,arr與int*兼容,而不是int&。你的代碼不會編譯。也許你想return arr[0]

6

正如其他人所說,有更好的選擇,如STL容器,最有趣的問題是爲什麼你需要返回數組到一個已經在範圍內的函數。

這就是說,不能傳遞或返回值數組和需要避免陣列衰減的指針(參見例如here),或者通過使用指針或引用它:

int (&f(int (&arr)[3]))[3] 
{ 
    return arr; 
} 

如果你不想硬編碼大小,你可以使用模板函數:

template<size_t n> 
int (&f(int (&arr)[n]))[n] 
{ 
    return arr; 
} 
+0

這是一些嚴重的_twisted_語法。你甚至可以在這裏獲得很多榮譽。我現在可以自由地使用typedefs,我知道_你可能已經拼寫到編譯器沒有_... +1 – sehe 2011-09-14 22:03:41

+0

假設我想爲一個固定大小的數組編寫一個getter,並希望該方法以及引用的數組是const - 我將如何做到這一點在語法上?像這樣: int const(&GetArray()const)[3] {return mArray; }? – Bjoern 2015-03-13 09:06:43

+0

@Bjoern:'typedef int A [3]; const A m; const A&f()const {return m; ''? – 2015-03-16 13:17:12

0

使用std :: vector就像這樣。

std::vector<int> function(const std::vector<int>& arr) 
{ 
    return arr; 
} 

int arr[] = {...}; 

數組是沒有用的,從一個功能,因爲它不能將其自身複製返回。

0

如果沒有必要,請勿使用它。你可以只傳遞一個數組的引用,如:

void foo(std::vector<int> &v) { 
    for (int i = 0; i < 10; ++ i) { 
     v.push_back(i); 
    } 
} 

如果你使用:

std::vector<int> foo() { 
    std::vector<int> v; 
    for (int i = 0; i < 10; ++ i) 
     v.push_back(i); 

    return v; 
} 

就會有容器的複製過程中,成本是昂貴的。

FYI:NRVO可能消除成本

1

我認爲你最好的選擇是將它作爲指針返回給數組。這裏是一個例子:

{ 
    ... 
    int newLength = 0; 
    int* arr2 = ChangeArray(arr, length, newLength); 
    ... 
    delete[] arr2; 
} 

int* ChangeArray(int arr[], int length, int& newLength) 
{ 
    // reversing the number - just an example 
    int* newArr = new int[length]; 
    for(int i = 0; i < length; i++) 
    { 
     newArr[i] = arr[length-i-1]; 
     newLength++; 
    } 
    return newArr; 
} 
3

以下的作品,似乎並不混亂或誤解了!

int* returnarray(int a[]) 
{ 
    for (unsigned int i = 0; i < 3; i++) 
    { 
     a[i] *= 2; 
    } 
    return a; 
} 

int main(int argc, char* argv[]) 
{ 
    int arr[3] = {1,2,3}; 
    int* p = returnarray(arr); 
    for (unsigned int i = 0; i < 3; i++) 
    { 
     cout << "p[" << i << "] = " << p[i] << endl; 
    } 
     cin.get(); 
     return 0; 
}