Самостоятельная работа2 по дисциплине: "Программирование 1"
Download 230.12 Kb.
|
Самостоятельная 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling