завершении программы или функции, в которой была описана переменная, память автоматически освобождается.
Доступ к объявленной переменной осуществляется по ее имени. При этом все обращения к переменной меняются на адрес ячейки памяти, в которой хранится ее значение.
Доступ к значению переменной можно получить иным способом – определить собственные переменные для хранения адресов памяти. Такие переменные называют указателями.
Итак, указатель – это переменная, значением которой является адрес памяти, по которому храниться объект определенного типа (другая переменная).
Как и любая переменная, указатель должен быть объявлен. При объявлении указателей всегда указывается тип переменной, значение которой будет храниться по данному адресу. Звездочка в описании указателя относиться непосредственно к имени, поэтому, чтобы объявить несколько указателей, ее ставят перед именем каждого из них.
При работе с указателями часто используют операции получения адреса (&) и разыменования (*). Операция получения адреса (&) возвращает адрес своего операнда. Операция разыменования (*) возвращает значение переменной, хранящееся по заданному адресу, то есть выполняет действие, обратное операции получения адреса (&).
C помощью указателей можно передавать адреса фактических параметров функциям и адреса функций в качестве параметров, создавать новые переменные в процессе выполнения программы, обрабатывать массивы, строки и структуры.
Понятие о ссылках
Формат описания ссылки:
тип &идентификатор_1 = идентификатор_2;
#include <iostream>
using namespace std;
int main(void)
{ int a = 5, b = 10;
int &aRef = a; // aRef является ссылкой на а
aRef = b; // а равно b
aRef++; // a++;
cout << "a = " << a << endl;
}
Понятие о ссылках
Ссылка на некоторую переменную может рассматриваться как указатель, который при работе с ним всегда разыменовывается. Для ссылки не требуется дополнительного пространства в памяти: она является просто другим именем или псевдонимом переменной. Для определения ссылки применяется унарный оператор &.
Ссылка не создает копию объекта, а лишь является другим именем объекта. Чаще всего ссылки используются для передачи параметров в функции.
Способы передачи параметров
// Поиск максимального из двух чисел
#include <iostream>
using namespace std;
// передача параметров по значению
int max(int a, int b)
{ if (a > b) return a;
else return b;
}
int main(void)
{ int m, k, i;
cout << "i = "; cin >> i;
cout << "k = "; cin >> k;
m = max(i, k); // вызов функции
cout << "max = " << m << endl;
}
Способы передачи параметров
Передача фактических параметров в функцию может происходить:
по значению,
по адресу.
При передаче в функцию фактического параметра по значению, соответствующий формальный параметр получит копию значения фактического параметра. Функция работая с копией фактического параметра не может изменить оригинальное значение фактического параметра. Это происходит потому, что копия фактического параметра (формальный параметр) создается в стеке. В момент завершения работы функции стековое пространство, в котором находятся формальные параметры функции, очищается, уничтожая находящиеся в нем данные. При этом значение-оригинал фактического параметра оказывается недоступным для функции.
В примере фактические параметры i и k передаются в функцию max по значению, т. е. формальный параметр a получит копию значения фактического параметра i, а формальный параметр b получит копию значения фактического параметра k.
Способы передачи параметров
// Обмен значений двух переменных
#include <iostream>
using namespace std;
// передача параметров по адресу с использованием указателей
void change1(int *a1, int *b1)
{ int c = *a1;
*a1 = *b1;
*b1 = c;
}
int main(void)
{ int a, b;
cout << " a : "; cin >> a;
cout << " b : "; cin >> b;
change1(&a, &b);
cout << endl << " a = " << a << endl;
cout << " b = " << b << endl;
}
Способы передачи параметров
Если функция в процессе своей работы должна изменить значение фактического параметра, то его нужно передать по адресу, с использованием указателя или по ссылки.
Для передачи в функцию фактического параметра по адресу с использованием указателя необходимо:
Оформить фактический параметр, либо как указатель ранее инициализированный, либо как обычную переменную к которой применена операция прямой адресации (&);
Оформить в заголовке функции соответствующий формальный параметр как указатель;
При передаче в функцию фактического параметра по адресу с использованием указателя соответствующий формальный параметр получает адрес фактического параметра и в функции можно применить операцию разыменования (*) формального параметра указателя, получая таким образом доступ к значению фактического параметра и возможность его изменения.
В примере формальные параметры указатели a1 и b1 получат адреса фактических параметров a и b.
Способы передачи параметров
// Обмен значений двух переменных
#include <iostream>
using namespace std;
// передача параметров по адресу с использованием ссылок
void change2(int& a1, int& b1)
{ int c = a1;
a1 = b1;
b1 = c;
}
int main(void)
{ int a, b;
cout << " a : "; cin >> a;
cout << " b : "; cin >> b;
change2(a, b);
cout << endl << " a = " << a << endl;
cout << " b = " << b << endl;
}
Способы передачи параметров
Для передачи в функцию фактического параметра по адресу