- завершении программы или функции, в которой была описана переменная, память автоматически освобождается.
-
Доступ к объявленной переменной осуществляется по ее имени. При этом все обращения к переменной меняются на адрес ячейки памяти, в которой хранится ее значение.
-
Доступ к значению переменной можно получить иным способом – определить собственные переменные для хранения адресов памяти. Такие переменные называют указателями.
-
Итак, указатель – это переменная, значением которой является адрес памяти, по которому храниться объект определенного типа (другая переменная).
-
Как и любая переменная, указатель должен быть объявлен. При объявлении указателей всегда указывается тип переменной, значение которой будет храниться по данному адресу. Звездочка в описании указателя относиться непосредственно к имени, поэтому, чтобы объявить несколько указателей, ее ставят перед именем каждого из них.
-
При работе с указателями часто используют операции получения адреса (&) и разыменования (*). Операция получения адреса (&) возвращает адрес своего операнда. Операция разыменования (*) возвращает значение переменной, хранящееся по заданному адресу, то есть выполняет действие, обратное операции получения адреса (&).
-
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;
}
Способы передачи параметров
-
Для передачи в функцию фактического параметра по адресу