Указатели - аргументы функций.
Работая с аргументами функций в С++, Вы, наверное, обратили внимание на следующий факт: передавая аргументы в функцию по значению, сами переменные, после отработки функции, свое значение не изменяли. Это можно объяснить следующим образом: функции в качестве своих аргументов получают значения параметров, поэтому прямой возможности, находясь в вызванной функции, изменить переменную функции, откуда произошел вызов, нет. Однако, большинство практических приложений, как раз требуют от программиста решения следующей задачи: передать в функцию переменные; произвести изменения значений переменных; после отработки функции, переменные должны остаться с измененными значениями. Есть ли решение данной проблемы?.. Ответ может быть только один - да и, как один из вариантов, с помощью указателей.
Для того, чтобы разобраться с механизмом передачи аргументов в функцию, с последующим изменением их значений внутри вызванной функции, рассмотрим функцию my_swap, которая меняет местами значения своих параметров. Другими словами, если объявлены две переменные типа int a, b; причем, a=7 и b=10, то после вызова функции my_swap(&a, &b) результат будет следующим: а=10 и b=7.
Чтобы получить желаемый эффект, надо вызываемой функции передать указатели на те значения, которые должны быть изменены: my_swap(&a, &b); Так как оператор & получает адрес переменной, то &a вернет нам адрес переменной а. Таким образом, используя оператор & для получения адреса переменных (значение которых должно будет измениться в функции), мы сможем передать в функцию адреса наших переменных.
Графически это можно представить следующим образом:
В самой функции my_swap параметры должны быть описаны как указатели, при этом доступ к значениям параметров будет осуществляться через них косвенно. Такой вызов функции называется вызовом функции с передачей параметров по ссылке, причем, при обращении к функции адреса переменных должны передаваться как аргументы.
Рассмотрим реализацию функции, которая будет изменять значения своих параметров:
//реализация функции, которая будет изменять значения своих параметровvoid my_swap(int *px, int *py) { int temp;//производим стандартную перестановку через дополнительную переменную temp temp=*px; //переменной temp писвоили 7 *px=*py; //переменная а приняла значение 10 *py=temp; //переменная b приняла значение 7}Теперь, вызов функции из main() будет выглядеть следующим образом:
my_swap(&a, &b);Разобрав механизм вызова функции с передачей параметров по ссылке, рассмотрим практический пример использования, опять таки, нашей функции:
/*Иллюстрация использования механизма вызова функции спередачей параметров по ссылке*/ #include <iostream.h>//реализация функции, которя будет изменять значения своих параметровvoid my_swap(int *px, int *py) { int temp;//производим стандартную перестановку через дополнительную переменную temp temp=*px; //переменной temp писвоили 7 *px=*py; //переменная а приняла значение 10 *py=temp; //переменная b приняла значение 7} void main(){ int a,b; //объявили две переменные типа int cout<<"Enter a = "; //вывели на экран предложение ввести значение переменной а cin>>a; cout<<"Enter b = "; //вывели на экран предложение ввести значение переменной b cin>>b; my_swap(&a, &b); //ВЫЗОВ ФУНКЦИИ С ПЕРЕДАЧЕЙ ПАРАМЕТРОВ ПО ССЫЛКЕ cout<<"New value of a = "<<a<<endl; //выведем на экран результат работы нашей программы cout<<"New value of b = "<<b<<endl;}Давайте, подведем итоги:
аргументы-указатели позволяют функции осуществлять доступ к объектам вызвавшей ее функции и дают ей возможность изменить эти объекты. Если Вы хотите произвести вызов функции с передачей параметров по ссылке с ипользованием указателей, придерживайтесь следующих инструкций:
- Объявите параметры-указатели в заголовке функции.
- Используйте разыменованный указатель в теле функции.
- Передавайте адреса в качестве аргументов при вызове функции.