Назад | Начало урока | Вперед
Содержание

Глава 8

Вверх

Вариант функции swap() для работы с указателями

При передаче указателя на самом деле передается лишь адрес объекта, а следовательно функция получает возможность манипулировать значением, находящимся по этому адресу. Чтобы заставить функцию swap() изменить реальные значения с помощью указателей, ее нужно объявить так, чтобы она принимала два указателя на целые значения. Затем ссылаясь на указатели, соответствующие переменным x и y , можно фактически поменять местами их значения.

Передача аргументов по ссылке с помощью указателей

//Listing 9.6 Demonstrates passing by reference


#include <iostream>

using namespace std;
void swap(int *x, int *y);

int main() {

int x = 5, y = 10;

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 *px, int *py) {

int temp;

cout << "Swap. Before swap, *px: " << *px <<
" *py: " << *py << "\n";

temp = *px;
*px = *py;
*py = temp;

cout << "Swap. After swap, *px: " << *px << " *py: " << *py << "\n";

}


Результат:

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

Получилось! Здесь в функции swap() в качестве параметров объявляются указатели на значения типа int а не сами переменные типа int. При вызове в строке 12 функции swap() в качестве аргументов передаются адреса переменных x и y. Теперь указатели указывают на переменные x и y(поскольку указатели инициализированы теперь адресами этих переменных). В результате значения переменных вызывающей функции, адреса которых были переданы функции swap() успешно поменялись местами.

То есть здесь получается что когда мы передаем функции в качестве аргументов адреса переменных это аналогично инициализации указателей адресами переменных int *px=&x; int *py=&y; После инициализации естественно указатель будет указывать на переменную адресом которой он инициализирован.

Вверх

Реализация функции swap() для работы со ссылками

//Listing 9.7 Demonstrates passing by reference // using references!


#include <iostream>

using namespace std;
void swap(int &x, int &y);

int main() {

int x = 5, y = 10;

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) {

int temp;

cout << "Swap. Before swap, rx: " << rx << " ry: " << ry << "\n";

temp = rx;
rx = ry;
ry = temp;

cout << "Swap. After swap, rx: " << rx << " ry: " << ry << "\n";

}

Результат:

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

Поскольку параметры для функции swap() объявлены как ссылки, то и переменные из функции main() передаются как ссылки, следовательно они так же изменяются и в функции main(). Таким образом, благодаря использованию ссылок функция приобретает новую возможность изменять исходные данные в вызывающей функции, хотя при этом сам вызов функции ничем не отличается от обычного.

Моя заметка: В чем разница инициализации указателей и ссылок? Можно объявить указатель на тип и инициализировать его адресом переменной:

USHORT myAge; // a variable
USHORT * pAge = 0; // a pointer
myAge = 5;

cout << "myAge: " << myAge << "\n";
pAge = &myAge; // инициализируй указатель адресом переменной
cout << "*pAge: " << *pAge << "\n\n";

Rectangle* pRect = new Rectangle;
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;

Теперь rCat псевдоним Frisky, в rCat содержится адрес Frisky. Или просто поставить перед переменной знак амперсанда и это будет адрес переменной.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz