Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры к экзамену по программированию в 1 семест....doc
Скачиваний:
26
Добавлен:
22.04.2019
Размер:
576 Кб
Скачать

23. Указатели. Типизированные и безтиповые указатели. Операция разыменования и операция получения адреса.

Переменные-указателиВ памяти могут находится данные разных типов, переменные и константы. Указатель – это переменная, которая содержит адрес памяти. Этот адрес как правило является адресом некоторой другой переменной. Тип данных переменных, на который указывает указатель называется базовым типом данных. Стандартный вид обьявления указателя: тип * имя  Oператоры для работы с указателями Унарные операторы * и & имеют более высокий приоритет, чем арифметические операторы, Oператор & - этот оператор возвращает адрес объекта, так что инструкция ip = &x;присваивает указателю ip адрес переменной x. Унарный оператор * возвращает значение переменной, находящейся по данному адресу. Для получения значение переменной х, адрес которой присвоен ip, нужно записать *iр. Этот оператор называют оператором разыменования или косвенного доступа.

Указатель - это ячейка памяти, хранящая адрес. В PascalABC.NET указатели делятся на типизированные (содержат адрес ячейки памяти данного типа) и бестиповые (содержат адрес оперативной памяти, не связанный с данными какого-либо определенного типа).

24. Классы памяти в C++. Механизмы выделения и освобождения динамической памяти.

Динамическое выделение памяти Выделение динамической памяти для переменной типа int можно выполнить двумя способами: a) с помощью функции malloc, описанной еще в языке C: int *pi=(int*)malloc(sizeof(int)); (функция malloc возвращает значение типа void *, и необходимо выполнить преобразование типа) b) с помощью появившейся в C++ операции new: int *pi = new int; Освобождение памяти соответственно: free(pi); delete pi;

int **mas; // 1 mas = new int *[M]; // 2 for (int i=0; i<M; i++) // 3 mas[i] = new int [N]; // 4 For (int i=0; i<M; i++) delete [] mas[i]; delete [] mas;

25. Арифметические операции над указателями.

Инициализация указателей, присваивание им новых значений, может быть выполнена несколькими способами:

1. Присваивание указателю адреса уже существующего объекта, например:

char c;

char *pc = &c;

2. Присваивание указателю значения другого указателя, например:

char c;

char *pc1 = &c, *pc2 = pc1;

3. Присваивание указателю адреса памяти в явном виде.

char *pc = (char *)0x000012D4;

В этом примере указана операция преобразования типа в виде, стандартном для C++.

4. Присваивание указателю специального пустого значения NULL:

char *pc = NULL;

Сложение и вычитание числовых значений из указателей

Можно сложить значение n типа int, uint, long или ulong с указателем p, любого типа, кроме void*. В результате p+n получится указатель, являющийся суммой n * sizeof(p) to the address of p. Аналогично, результатом p-n является указатель, полученный вычитанием n * sizeof(p) из адреса p.Вычитание указателей Также можно вычитать указатели одного типа. Тип результата всегда long. Например, если p1 и p2 являются указателями типа pointer-type*, то результат выражения p1-p2 будет следующим:((long)p1 - (long)p2)/sizeof(pointer_type)

При переполнении домена указателя в результате выполнения арифметической операции исключений не генерируется, а результат зависит от конкретной реализации.