6.2.1. Передача аргумента по значению
При инициализации переменной не ссылочного типа значение инициализатора копируется. Изменения значения переменной никак не влияют на инициализатор:
int n = 0; // обычная переменная типа int
int i = n; // i - копия значения переменной n
i = 42; // значение i изменилось, значение n - нет
Передача аргумента по значению осуществляется точно так же; что бы функция не сделала с параметром, на аргумент это не повлияет. Например, в функции fact() (см. раздел 6.1) происходит декремент параметра val:
ret *= val--; // декремент значения val
Хотя функция fact() изменила значение val, это изменение никак не повлияло на переданный ей аргумент. Вызов fact(i) не изменяет значение переменной i.
Параметры указателя
Указатели (см. раздел 2.3.2) ведут себя, как любой не ссылочный тип. При копировании указателя его значение копируется. После создания копии получается два отдельных указателя. Однако указатель обеспечивает косвенный доступ к объекту, на который он указывает. Значение этого объекта можно изменить при помощи указателя (см. раздел 2.3.2):
int n = 0, i = 42;
int *p = &n, *q = &i; // p указывает на n; q указывает на i
*p = 42; // значение n изменилось, значение p - нет
p = q; // теперь p указывает на i; значения i и n
// неизменны
То же поведение характерно для указателей, являющихся параметрами:
// функция получает указатель и обнуляет значение, на которое он
// указывает
void reset(int *ip) {
*ip = 0; // изменяет значение объекта, на который указывает ip
ip = 0; // изменяет только локальную копию ip; аргумент неизменен
}
После вызова функции reset() объект, на который указывает аргумент, будет обнулен, но сам аргумент-указатель не изменится:
int i = 42;
reset(&i); // изменяет значение i, но не адрес
cout << "i = " << i << endl; // выводит i = 0
Программисты, привыкшие к языку С, зачастую используют параметры в виде указателей для доступа к объектам вне функции. В языке С++ для этого обычно используют ссылочные параметры.
Упражнения раздела 6.2.1
Упражнение 6.10. Напишите, используя указатели, функцию, меняющую значения двух целых чисел. Проверьте функцию, вызвав ее и отобразив измененные значения.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОК