2016-10-04 91 views
1

我做了一個非常簡單的代碼,學習C++。我發現,當我將堆棧上創建的數組發送到另一個函數時,函數將更改源數組 - 這與其他變量不同。像一個int或其他東西。按值作爲參數發送一個數組?

這是爲什麼?

代碼:

void ByValue(int arr[], int size) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     arr[i] += 1; 
    } 
} 

void SimpleArray() 
{ 
    int arr[3]; 

    for (int i = 0; i < 3; i++) 
    { 
     arr[i] = i+1; 
     cout << "Element [" << i << "] is " << arr[i] << endl; 
    } 
    cout << endl; 
    ByValue(arr, 3);// <-- should be by value 
    for (int i = 0; i < 3; i++) 
    { 
     cout << "Element after change [" << i << "] is " << arr[i] << endl; // <-- this shouldent change ? 
    } 
    cout << endl; 

} 

給出的輸出:

Element [0] is 1 
Element [1] is 2 
Element [2] is 3 

Element after change [0] is 2 
Element after change [1] is 3 
Element after change [2] is 4 

第二輸出應是相同的,第一,如果它是由值, 通過,但現在是像我使用的指針?

+1

使用'std :: array'實現按值傳遞數組 –

回答

4

有效地,原型ByValue

void ByValue(int* arr, int size)

即陣列已經衰減到指針類型。所以因此修改數組是反映在調用者中的

請注意,符號*(arr + n)相同arr[n]

+0

注意:參數已經*調整爲指針。參數*衰減*因爲參數是指針。 – juanchopanza

+0

但數組仍然在堆棧上?那麼byValue中的poniter指向堆棧? – Niklas

+1

陣列當然有自動存儲時間。指針也可以指向這些類型。 – Bathsheba

1

將一個數組傳遞給一個函數會將其衰減爲指針。所以實際上正在對原始數組進行更改。 arr只是數組中第一個元素的地址。並且該地址正在傳遞給該函數。因此,在功能,如果你做

arr[index] = value;, 它被細分*(arr + index) = value;這將使您的原始數組爲arr的變化是相同的地址作爲原始數組的第一個元素的地址。