Учимся программировать на языке C++

         

ПОЧЕМУ ФУНКЦИИ ОБЫЧНО НЕ МОГУТ ИЗМЕНИТЬ ЗНАЧЕНИЯ ПАРАМЕТРОВ


Следующая программа NOCHANGE.CPP передает два параметра с именами big и small в функцию display_values. Функция display_values, в свою очередь, присваивает обоим параметрам число 1001 и затем выводит значение каждого параметра. Когда функция завершается, программа возобновляется и выводит значения этих же параметров:

#include iostream.h

void display_values(int a, int b)

{ a = 1001;

b = 1001;

cout "Значения в функции display_values равны " а " и " b endl;

}

void main(void)

{

int big = 2002, small = 0;

cout "Значения до функции " big " и" small endl;

display_values(big, small);

cout "Значения после функции " big " и " small endl;

}

Когда вы откомпилируете и запустите эту программу, на экране появится следующий вывод:

С:\ NOCHANGE ENTER

Значения до функции 2002 и 0

Значения в функции display_values равны 1001 и 1001

Значения после функции 2002 и 0

Как видите, значения параметров в функции display_values были изменены (1001). Однако после завершения функции значения переменных big и small в main остались прежними. Чтобы понять, почему изменение параметров не повлияло на переменные big и small в main, вам необходимо понять, как C++ передает параметры в функции.

Когда ваши программы передают параметр в функцию, то по умолчанию С++ делает копию значения параметра и помещает эту копию во временный участок памяти, называемый стеком. Затем функция использует копию значения для выполнения своих операций. Когда функция завершается, C++ сбрасывает содержимое стека и все изменения, сделанные функцией в копиях эначений параметра.

Как вы знаете, переменная представляет собой имя, присваиваемое вашей программой ячейке памяти, которая хранит значение определенного типа. Предположим, например, что переменные big и small находятся в ячейках памяти 10 и 12. Если вы передадите переменные в функцию display_values, C++ поместит копии значений этих переменных в стек. На 10.1 показано, что далее функция display_values будет использовать копии значений переменных.




10.1. C++ размещает копии значений параметров во временном участке памяти, называемом стеком.

Как видите, функция display_values может обращаться к содержимому стека, в котором находятся копии значений 2002 и 0. Так как функция display_values ничего не знает о ячейках памяти big и small (адреса 10 и 12), функция не может изменить реальные значения переменных.

Почему функции C++ обычно не могут изменить значения параметров

Когда вы передаете параметры в функцию, C++ размещает копии значений параметров во временном участке памяти, называемом стеком. Любые изменения, выполняемые функцией над параметрами, проявляются только внутри стека. Когда функция завершается, C++ сбрасывает содержимое стека вместе с любыми изменениями, которые функция произвела в параметрах. Поскольку функция не знает адрес памяти параметра, она не может изменить его значение.


Содержание раздела