2016-10-04 8 views
1

Я сделал очень простой код, чтобы узнать C++. И я сделал открытие, что, когда я отправляю массив, созданный в стеке, другой функции, funtion меняет исходный массив - это не так с другими переменными. Как 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' для достижения передачи arays по значению –

ответ

4

Эффективно, прототип ByValue является

void ByValue(int* arr, int size)

т.е. массив распадалось к типу указателя. Поэтому поэтому изменения в массиве - это, отраженные в вызывающем.

Отметьте, что обозначение *(arr + n) соответствует идентичным по arr[n].

+0

Примечание: параметр был * скорректирован * на указатель. Аргумент * распадается *, потому что параметр является указателем. – juanchopanza

+0

Но массив все еще находится в стеке? Итак, poniter in byValue указывает на стек? – Niklas

+1

Массив, конечно, имеет автоматическую продолжительность хранения. Указатели также могут указывать на эти типы. – Bathsheba

1

Передача массива функции прерывает его указатель. Таким образом, в исходном массиве происходят изменения. arr - это не что иное, как адрес первого элемента массива. И этот адрес передается функции. Таким образом, в функции, если вы

arr[index] = value;, она разбивается, как *(arr + index) = value;, который сделает изменения в вашем исходном массиве как arr тот же адрес в качестве адреса первого элемента исходного массива.

Смежные вопросы