Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++ 3 minimax.docx
Скачиваний:
6
Добавлен:
25.09.2019
Размер:
99.99 Кб
Скачать

1)Указатели.

Указатель - это переменная, содержащая адрес некоторого объекта, например, другой переменной. Это дает возможность косвенного доступа к этому объекту через указатель. Пусть x - переменная типа int. Обозначим через px указатель. Унарная операция & выдает адрес объекта, так что оператор px = &x; присваивает переменной px адрес переменной x. Говорят, что px "указывает" на x. Операция & применима только к адресным выражениям, так что конструкции вида &(x-1) и &3 незаконны.

Унарная операция * называется операцией разрешения адреса. Она рассматривает свой операнд как адрес и обращается по этому адресу, чтобы извлечь объект, содержащийся по этому адресу. Следовательно, если y тоже имеет тип int, то y = *px; присваивает y содержимое того, на что указывает px. Так, последовательность px = &x; y = *px; присваивает y то же самое значение, что и оператор y = x; Все эти переменные должны быть описаны: int x, y; int *px; Последнее - описание указателя. Оно говорит, что комбинация *px имеет тип int или, иначе, px есть указатель на int. Это означает, что если px появляется в виде *px, то это эквивалентно переменной типа int. Из описания указателя следует, что он может указывать только на определенный вид объекта (в данном случае int). Разадресованный указатель может входить в любые выражения там, где может появиться объект того типа, на который он указывает. Так, оператор y = *px + 2; присваивает y значение, на 2 больше, чем х.

Если px указывает на х, то *px = 3; полагает х равным 3, а *px + = 1; увеличивает х на 1 , также как и выражение (*px) ++

3) Инициализация указателей

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

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

int* p = &a; // в указатель записывается адрес a

int* r = p;

________________________________________

int b[10]; // массив

int* t = b; // присваивание имени массива

________________________________________

void (*pf)(int); // указатель на функцию

pf = f; // присваивание имени функции

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

char* vp = (char *)0xB8000000; // шестнадцатеричная константа

3. Присваивание пустого значения:

int* suxx = NULL; // не рекомендуется; или int* rulez = 0; // так - лучше

4. Выделение участка динамической памяти и присваивание ее адреса указателю с помощью операции new

int* q = new int [10];

Освобождение памяти, выделенной с помощью операции new, должно выполняться с помощью delete

5) Операции с указателями

С указателями можно выполнять следующие операции:

разадресация (*), - предназначена для доступа к величине, адрес которой хранится в указателе.

присваивание,

сложение с константой,

вычитание,

инкремент (++), декремент (- -),

сравнение,

char a; // переменная типа char

char * p = new char;/* выделение памяти под указатель и под динамическую переменную типа char */

*p = 'Ю'; a = *p; // присваивание значения обеим переменным

Присваивание типизированных указателей указателям функций (и наоборот) недопустимо. Арифметические операции с указателями (сложение с целым, вычитание, инкремент и декремент) автоматически учитывают размер типа величин, адресуемых указателями. Эти операции применимы только к типизированным указателям одного типа и имеют смысл в основном при работе со структурами данных, последовательно размещенными в памяти, например, с массивами.

Инкремент перемещает указатель к следующему элементу массива, декремент - к предыдущему. Фактически значение указателя изменяется на величину sizeof(тип). Разность двух указателей - это разность их значений, деленная на размер типа в байтах. Суммирование двух указателей не допускается. При записи выражений с указателями следует обращать внимание на приоритеты операций . В качестве примера рассмотрим последовательность действий, заданную в операторе *p++ = 10; То же самое можно записать подробнее: *p = 10; p++; Выражение (*p)++, напротив, инкрементирует значение, на которое ссылается указатель.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]