Скачать презентацию Тема 4 Указатели и ссылки int i Скачать презентацию Тема 4 Указатели и ссылки int i

Основы программирования, Тема 4.pptx

  • Количество слайдов: 17

Тема 4 Указатели и ссылки Тема 4 Указатели и ссылки

int i = 10; выделение памяти в соответствии с типом int и инициализация указанным int i = 10; выделение памяти в соответствии с типом int и инициализация указанным значением (10) cout << i; //обращение к области памяти Указатели предназначены для хранения адресов областей памяти. Указатели: на объект на функцию на void • • • Указатель - НЕ самостоятельный тип

Указатели на функции Указатель на функцию содержит адрес в сегменте кода, по которому располагается Указатели на функции Указатель на функцию содержит адрес в сегменте кода, по которому располагается исполняемый код функции (адрес, по которому передается управление при вызове функции. Вызов функции происходит не по ее имени, а косвенно - через обращение к переменной, хранящей адрес функции. тип (*имя) (список_аргументов); int (*fun) (double, double); - задает указатель с именем fun на функцию, возвращающу значение типа int и имеющую два аргумента типа double

Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа (основного Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа (основного или составного) тип *имя; где тип может быть любым (кроме ссылки) Звездочка относится непосредственно к имени: int *a, b, *c; // объявляются 2 указателя на int и одна переменная типа int

Указатели на void Указатель на void применяется в тех случаях, когда конкретный тип объекта, Указатели на void Указатель на void применяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить не определен

Примеры int i; //целая переменная const int ci = 1; //целая константа int * Примеры int i; //целая переменная const int ci = 1; //целая константа int * p_i; //указатель на целую переменную const int * p_ci; //указатель на целую константу int * const cp = &i; //указатель-константа на целую переменную const int * const cpc = &ci; //указатель-константа на целую константу & - операция получения адреса

Динамическая память Указатели чаще всего используют при работе с динамической памятью кучей. Это свободная Динамическая память Указатели чаще всего используют при работе с динамической памятью кучей. Это свободная память, в которой можно во время выполнения программы выделять место в соответствии с потребностями. Доступ к выделенным участкам динамической памяти (динамическим переменным) производится только через указатели. Время жизни динамических переменных - от точки создания до конца программы или до явного освобождения памяти. Способы работы с динамической памятью: семейство функций malloc (от С) операции new, delete • •

Инициализация указателей 1. Присваивание указателю адреса существующего объекта /* с помощью операции получения адреса*/ Инициализация указателей 1. Присваивание указателю адреса существующего объекта /* с помощью операции получения адреса*/ int a = 5; // целая переменная int* p 1 = &a; // в указатель записываем адрес a int* p 2 (&a); // то же самое другим способом /* с помощью значения другого инициализированного указателя*/ int* r = p; /* с помощью имени массива или функции, которые трактуются как адрес*/ int b[10]; // массив int* t = b; // присваивание адреса начала массива. . . void f(int a) {/*. . . */} // определение функции void (*pf)(int); // указатель на функцию pf = f; // присваивание адреса функции

Инициализация указателей 2. Присваивание указателю адреса области памяти в явном виде char * vp Инициализация указателей 2. Присваивание указателю адреса области памяти в явном виде char * vp = (char *)0 x. B 8000000; // операция (char *) - операция приведения типа; // 0 x. B 8000000 - шестнадцатеричная константа 3. Присваивание пустого значения int* empty= NULL; int* A = 0; // NULL - константа, определенная как 0, определяется в заголовочных файлах // Рекомедуется использовать 0. // Т. к. гарантируется, что не существует объектов с нулевым адресом, то пустой указатель можно использовать для проверки, ссылается ли указатель на конкретный объект или нет

Инициализация указателей 4. Выделение участка динамической памяти и присваивание ее адреса указателю /*с помощью Инициализация указателей 4. Выделение участка динамической памяти и присваивание ее адреса указателю /*с помощью операции new*/ int* n = new int; int* m = new int(10); // выделяется память и инициализируется 10 int* p = new int[5]; // выделение памяти под 5 int-ов /*с помощью операции malloc*/ int* u = (int*) malloc(sizeof(int)); // наследие C

Освобождение памяти, выделенной при помощи new должно выполняться с помощью операции delete, malloc - Освобождение памяти, выделенной при помощи new должно выполняться с помощью операции delete, malloc - free. При освобождении памяти переменная-указатель сохраняется и может использоваться повторно. delete n; delete m; delete []q; free (u); !!! если переменная-указатель выходит из области своего действия, отведенная под нее память освобождается => динамическая переменная, на которую ссылается указатель, становится недоступной. При этом память из-под самой динамической переменно НЕ освобождается

"Мусор" - ячейки памяти недоступные для операций. 1. Если переменная-указатель выходит из области своего действия, отведенная под нее память освобождается => динамическая переменная, на которую ссылается указатель, становится недоступной. При этом память из-под самой динамической переменно НЕ освобождается. 2. Если инициализированному указателю присваивается значение другого указателя, то старое значение указателю бесследно теряется => образуется мусор

Операции с указателями Операция разадресации (разыменования) Осуществляет доступ к величине, адрес которой хранится в Операции с указателями Операция разадресации (разыменования) Осуществляет доступ к величине, адрес которой хранится в указателе. Можно использовать, как для получения, так и для изменения значенения величины (если она не объявлена как константа): char a; char * p = new char; динамическую // переменная типа char // выделение памяти под указатель и // переменную типа char *p = 'X'; переменным a = *p; // присваивание значения обеим

Операции с указателями Арифметические операции ++ перемещает указатель к следующему элементу массива -- перемещает Операции с указателями Арифметические операции ++ перемещает указатель к следующему элементу массива -- перемещает указатель к предыдущему элементу массива. фактически происходит изменение значения указателя на sizeof(тип) int* a; a += 5; // ~ + typeof(int) * 5 Разность двух указателей - это разность их значений, деленная на размер типа в байтах: int a[6]; &a[5] - &a[2] = 3 Сумма указателей - отсутствует

Ссылки Ссылка - синоним имени, указанного при инициализации ссылки. тип & имя; тип - Ссылки Ссылка - синоним имени, указанного при инициализации ссылки. тип & имя; тип - тип величины, на которую указывает ссылка & - оператор ссылки int k; int& p = k; альтернативное имя для k const char& NEW_LINE = 'n' // ссылка p// ссылка на константу

Ссылки • • Переменная-ссылка должна явно инициализироваться при ее описании (кроме случаев, когда она Ссылки • • Переменная-ссылка должна явно инициализироваться при ее описании (кроме случаев, когда она является параметром функции, описана как extern или ссылается на поле данных класса) После инициализации ссылке не может быть присвоена другая переменная Тип ссылки должен совпадать с типом величины, на которую она ссылается Не разрешается определять указатели на ссылки, создавать массивы ссылок и ссылки на ссылки.

Ссылки vs указатели Ссылки и указатели - разные сущности : ) Ссылка не занимает Ссылки vs указатели Ссылки и указатели - разные сущности : ) Ссылка не занимает дополнительного места в памяти, а является просто другим именем величины. Операция над ссылкой приводит к изменению самой величины, на которую она ссылается При использовании ссылок в качестве параметров функций, позволяют использовать переменные, передаваемые по адресу, без операции разадресации => улучшается читаемость программ.