Читайте также: |
|
Одно из следствий механизма передачи аргументов по значению состоит в том, что функция не может непосредственно модифицировать передаваемые аргументы. Мы продемонстрируем это на примере:
// Ex4_02.cpp// Бесполезная попытка модифицировать аргументы#include <iostream>using namespace std;int incr10(int num); // прототип int main(void){ int num = 3; cout << endl << "incr10(num) = " << incr10(num) << endl << "num = " << num; cout << endl; return 0;} // Функция для увеличения значения переменной на 10int incr10(int num) // используем то же самое имя, авось поможет...{ num += 10; // увеличиваем аргумент… - с надеждой return num; // возвращаем увеличенное значение }Как это работает
Конечно, мы не достигнем желаемого результата. После запуска программы получим:
incr10(num) = 13
num = 3
Это подтверждает тот факт, что исходное значение переменной num остается без изменения. Операция инкремента выполняется над сгенерированной копией переменной num.
Ясно, что в механизме передачи по значению обеспечивается высокая степень защиты аргументов от воздействия со стороны коварной функции, но бывает, что программист, в действительности, хочет изменить значения аргументов, находящихся в вызывающей функции. Конечно, такой способ существует. Особенно полезны для таких случаев указатели.
Указатели в качестве Аргументов функции
Agrave; cправка: Указатели. Указатель – это переменная, чье значение есть адрес другой переменной (простого типа данных или агрегатного типа (структурной переменной, например), или иного объекта). Тип данных указатель специфицирует тип той переменной, на которую указатель указывает. Указатель на переменную любого типа может принимать значение NULL. Значение NULL в заголовочном файле stdlib.h определен как 0. Хотя несколько указателей могут принимать значение 0, они остаются указателями разного типа, если таковыми определены. Например, NULL-указатель на int не тоже самое, что NULL-указатель на char. Таким образом, переменная может иметь тип указатель, о котором говорят, что он имеет (в свою очередь) тип, совпадающий с типом объекта, на который он указывает.
Указатели объявляются след. образом:
objecttype *pointername;
или, используя ключевое слово typedef (объявление типа-синонима),
typedef objecttype * pointertype;
pointertype pointername;
int x; // x- целоеint *x_ptr; // x_ptr – указатель на int x_ptr = &x; // x_ptr указывает на xx = 3;cout << x << " " << *x_ptr; //вывод значенияt=3 3ß
Когда мы используем указатель как аргумент, механизм передачи по значению по-прежнему действует. Но указатель – это, по своему значению, адрес другой переменной, и если создается копия указателя, то она по значению остается адресом, указывающим на ту же самую переменную. Посмотрим, как это будет выглядеть на примере.
Дата добавления: 2015-11-16; просмотров: 45 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Как это работает | | | Объявление и инициализация ссылок |