Глава 8
Вверх
При передаче указателя на самом деле передается лишь адрес объекта,
а следовательно функция получает возможность манипулировать значением,
находящимся по этому адресу. Чтобы заставить функцию swap() изменить
реальные значения с помощью указателей, ее нужно объявить так, чтобы
она принимала два указателя на целые значения. Затем ссылаясь на указатели,
соответствующие переменным x и y , можно фактически поменять местами
их значения.
Передача аргументов по ссылке с помощью указателей
//Listing 9.6 Demonstrates passing by reference
using namespace std;
int main()
{
cout << "Main. Before swap, x: " << x << " y: " << y << "\n";
void swap (int *px, int *py)
{
cout << "Swap. Before swap, *px: " << *px <<
temp = *px;
cout << "Swap. After swap, *px: " << *px <<
" *py: " << *py << "\n";
Получилось!
Здесь в функции swap() в качестве параметров объявляются
указатели на значения типа int а не сами переменные типа int.
При вызове в строке 12 функции swap() в качестве аргументов
передаются адреса переменных x и y.
Теперь указатели указывают на переменные x и y(поскольку указатели
инициализированы теперь адресами этих переменных).
В результате значения переменных вызывающей функции, адреса
которых были переданы функции swap() успешно поменялись местами.
То есть здесь получается что когда мы передаем функции в качестве
аргументов адреса переменных это аналогично инициализации
указателей адресами переменных
Вверх
//Listing 9.7 Demonstrates passing by reference
// using references!
using namespace std;
int main()
{
cout << "Main. Before swap, x: " << x << " y: "
<< y << "\n";
swap(x,y);
cout << "Main. After swap, x: " << x << " y: "
<< y << "\n";
return 0;
void swap (int &rx, int &ry)
{
cout << "Swap. Before swap, rx: " << rx << " ry: "
<< ry << "\n";
temp = rx;
cout << "Swap. After swap, rx: " << rx << " ry: "
<< ry << "\n";
Результат:
Поскольку параметры для функции swap() объявлены как ссылки,
то и переменные из функции main() передаются как ссылки, следовательно они
так же изменяются и в функции main().
Таким образом, благодаря использованию ссылок функция приобретает
новую возможность изменять исходные данные в вызывающей функции,
хотя при этом сам вызов функции ничем не отличается от обычного.
Моя заметка:
В чем разница инициализации указателей и ссылок?
Можно объявить указатель на тип и инициализировать его адресом переменной:
cout << "myAge: " << myAge << "\n";
Rectangle* pRect = new Rectangle;
Теперь rCat псевдоним Frisky, в rCat содержится адрес Frisky.
Или просто поставить перед переменной знак амперсанда и это будет
адрес переменной.
Назад |
Начало урока |
Вверх |
Вперед
Вариант функции swap() для работы с указателями
#include <iostream>
void swap(int *x, int *y);
swap(&x,&y);
cout << "Main. After swap, x: " << x << " y: " << y << "\n";
return 0;
" *py: " << *py << "\n";
*px = *py;
*py = temp;
Результат:
Main Before swap x:5 y:10
Swap. Before swap *px:5 *py:10
Swap. After swap, *px:10 *py:5
Main After swap, x:10 y:5
int *px=&x;
int *py=&y;
После инициализации естественно указатель будет указывать
на переменную адресом которой он инициализирован.
Реализация функции swap() для работы со ссылками
#include <iostream>
void swap(int &x, int &y);
rx = ry;
ry = temp;
Main Before swap x:5 y:10
Swap. Before swap rx:5 ry:10
Swap. After swap, rx:10 ry:5
Main After swap, x:10 y:5
USHORT myAge; // a variable
Можно объявить ссылку на тип и инициализировать ее просто переменной или
объектом:
USHORT * pAge = 0; // a pointer
myAge = 5;
pAge = &myAge; // инициализируй указатель адресом переменной
cout << "*pAge: " << *pAge << "\n\n";
const Rectangle * pConstRect = new Rectangle;
Rectangle * const pConstPtr = new Rectangle;
cout << "pRect width: " << pRect->GetWidth()
<< " feet\n";
cout << "pConstRect width: " << pConstRect->GetWidth()
<< " feet\n";
cout << "pConstPtr width: " << pConstPtr->GetWidth()
<< " feet\n";
SimpleCat Frisky(5,8);
SimpleCat & rCat = Frisky;
Содержание