Самостоятельная работа2 по дисциплине: "Программирование 1"


Download 230.12 Kb.
bet2/6
Sana31.01.2023
Hajmi230.12 Kb.
#1142966
TuriСамостоятельная работа
1   2   3   4   5   6
Bog'liq
Самостоятельная 1

Указатель
Определение
Для заданного типа T, тип T* является «указателем на T». Это означает, что переменные типа T*содержат адреса объектов типа T. До этого значения переменные, сохранённые как int a = 2; создавались и хранились в специально отведённом для них месте памяти, называемой стеком программы. Созданием и удалением таких переменных занимается сама ОС. Работа с указателем даёт возможность хранить переменные в другой области памяти, называемой кучей (англ. heap) и самостоятельно управлять занятием и освобождением этой памяти, тогда как в стек, вместо самого значения переменной, размер которой может быть от 1 байта и до +∞, записывается исключительно адрес, по которому можно взять значение этой переменной. Таким образом, язык Си++ даёт возможность выделить и проинициализировать память значением, получить адрес значения, получить само значение и, конечно же, освободить занимаемую память:
int *a = new int(2);
// Оператор new выделит память, 2 — значение, которым эта память будет проинициализирована
cout << a;
// Выведет адрес в шестнадцатеричном формате, например 0x102AF2
cout << *a;
// Выведет значение, которое располагается по адресу 0x102AF2. Т.е., 2
delete a;
// Пометит занимаемую область памяти, как освобождённую Из-за склонности ОС лишь отмечать для себя, что память освобождена, могут возникать ситуации, когда результат не соотносится с логикой. Следующий пример будет работать нормально, хотя должна возникать ошибка:
int *a = new int(2);
delete a;
cout << *a;
Ошибка не возникает лишь потому, что уже «мусорное» значение в памяти по-прежнему сохранено в первоначальном виде. Хотя, если предположить, что между моментами освобождения памяти и выводом значения память компьютера полностью переписывается, то возникнет всеми любимая сегментейшн фолт — ошибка доступа к памяти. Чтобы избежать возможных проблем рекомендуется помечать указатель как пустой. Следующий пример сразу выявит ошибку:
int *a = new int(2);
delete a;
a = 0;
// Существуют противники инициализации 0, поэтому можно делать по старинке:
a = NULL;
cout << *a;
Ссылка на значение При инициализации переменной значением другой переменной неявно происходит вызов копирования одной переменной в другую. Таким образом на выходе будут существовать 2 различные переменные, значение которых одинаково, и изменение значение одной переменной не приведёт к изменению значение другой:
int a = 2;
int b = a;
b = 3;
cout << a;
// Выведет 2 Ссылка & вместо копирования значения переменной задаст для этого значения ещё одно имя. Будут существовать 2 переменных, ссылающихся на одно и то же значение в памяти. Изменение значения через одну переменную приведёт к изменению значения второй. Вторая переменная будет алиасом первой, если такое определение будет понятней:
int a = 2;
int &b = a;
b = 3;
cout << a;
// Выведет 3 Также с помощью этого же оператора возможно получить адрес переменной:
int a = 2;
int *b = &a;
cout << b;
// Выведет адрес переменной a

Download 230.12 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling