- •ЛЕКЦИЯ 7
- •Указатели
- •Указатели
- •Указатели
- •Указатели
- •Указатели
- •Указатели
- •Указатели
- •Указатели
- •Указатели
- •Указатели
- •Указатели
- •Указатели и массивы
- •Указатели и массивы
- •Указатели и массивы
- •Указатели и строки
- •Указатели и строки
- •Указатели и строки
- •Указатели и строки
- •Указатели и перечисления
- •Указатели и структуры
- •Указатели и структуры
- •Указатели и структуры
- •Указатели и структуры
- •Указатели и структуры
- •Арифметика указателей
- •Арифметика указателей
- •Арифметика указателей
- •Арифметика указателей
- •Арифметика указателей
- •Динамическая память
- •Динамическая память
- •Динамическая память
- •Динамическая память
- •Динамическая память
- •Динамическая память
- •Динамическая память
- •Динамическая память
- •Динамическая память
- •Динамическая память
- •Динамическая память
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 1
- •Пример 2
- •Пример 2
- •Пример 2
- •Пример 3
- •Динамическая матрица
- •Пример 3
- •Пример 3
- •Пример 3
- •Пример 3
- •Пример 4
- •Пример 4
- •Пример 4
ЛЕКЦИЯ 7
Указатели Арифметика указателей Динамическая память
Функции для работы с памятью
Указатели
Указатель – это переменная, значением которой является адрес, по которому располагаются данные.
Адрес – это номер ячейки памяти, в которой или с которой располагаются данные.
Классифицировать указатели можно:
•по типу данных (типизированные и не типизированные указатели);
•по области доступа (ближние и дальние указатели).
Указатели
Типизированный указатель – указатель, содержащий адрес данных определенного типа (системного или пользовательского).
Не типизированный указатель – указатель, содержащий адрес данных неопределенного типа (просто адрес).
Указатели
Ближний указатель – указатель, содержащий только смещение, по которому располагаются данные. Сегмент в этом случае используется по умолчанию – текущий сегмент данных. Размер ближнего указателя в 16- разрядном реальном режиме работы процессора составляет 16 бит, а в 32-разрядном защищенном режиме
– 32 бита.
Дальний указатель – указатель, содержащий и сегмент и смещение. Размер дальнего указателя в 16-разрядном реальном режиме работы процессора составляет 32 бита (16 бит – сегмент, 16 бит - смещение), а в 32- разрядном защищенном режиме – 48 бит (16 бит – селектор, 32 бита - смещение).
Указатели
Работа с указателями в языке С включает три действия, осуществляемых в следующем порядке:
1.объявление указателя;
2.установка указателя;
3.обращение к значению, расположенному по указателю.
Указатели
Объявление (описание) указателя в языке C имеет следующий вид:
тип [near|far] *имя [=значение];
В современной реализации языка C (стандарт C99), ориентированной под разработку программ для ОС Windows, вследствие используемой в ОС Windows модели памяти, используются исключительно ближние (near) указатели, поэтому при объявлении указателя (например, в среде разработки Pelles C) модификатор области доступа указывать не надо.
Указатели
Указатель при объявлении можно инициализировать, указав через знак присвоения соответствующее значение. Данное значение должно быть адресом, записанном в одном из следующих виде:
•нулевое значение (идентификатор NULL);
•другой указатель;
•адрес переменной (через операцию взятия адреса);
•выражение, представляющее собой арифметику указателей;
•адрес, являющийся результатом выделения динамической памяти.
Указатели
Операция взятия адреса – операция языка C, возвращающая адрес переменной. Данная операция имеет следующий синтаксис:
&имя_переменной
Например, в программе описаны следующие переменные: int a,b;
double c;
Описание указателей на эти переменные с инициализацией будет иметь вид:
int *ptr_a = &a, *ptr_b = &b;
double *ptr_c1 = &c, *ptr_c2 = ptr_c1;
Указатели
Пример объявления не типизированного указателя с инициализацией нулевым значением:
void *ptr = NULL;
Указатели
Установка указателя - присвоение его значению адреса, по которому располагаются или будут располагаться данные.
Для установки указателя используется оператор присвоения, в левой части которого указывается имя указателя, а в правой – одно из значений отличных от NULL, используемых при инициализации указателя. Пример установки указателей:
int a = 10, *ptr = NULL; ptr = &a;