Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PYaVU_otvyty.docx
Скачиваний:
2
Добавлен:
04.08.2019
Размер:
100.42 Кб
Скачать

Билет 40. Указатели. Определение типизированных и нетипизированых указателей. Модель, используемая при работе с указателями. Операции с указателями.

Указатель в С – переменная, содержащая адрес объекта.

Пример определения: char *p. В данном случае у нас типизированный указатель: он будет указывать на объект типа char. Можно также создать нетипизированый указатель, он может быть применим абсолютно к любому объекту: void* p. (* может относиться как к типу, так и к имени, отличие только в том, что если * относится к имени, то все последующие имена указателями не будут, впрочем здесь кому как нравится). Однако если мы заранее знаем тип объекта, то лучше объявить типизированный указатель, это будет хорошим тоном.

Модель указателя:

р i

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

Присваивание. Указателю можно присвоить адрес. !тип объекта должен совпадать с типом указателя. Либо одному указателю присвоить значение другого указателя.

Разыменование. Оператор разыменования *. Операция * возвращает значение, хранящееся в ячейке, на которую ссылается указатель.

Взятие адреса (&). В С нередко используются указатели на указатели. Взятие адреса является обратной операции разыменования.

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

Вычисление разности указателей. Имеется возможность определить разность между двумя указателями, при этом получаем число. Обычно это делается для двух указателей на элементы, принадлежащие одному и тому же массиву, с тем, чтобы определить, насколько далеко они стоят друг от друга. Результат представляется в тех же единицах, что и размер типа. Вычитание является гарантированно допустимой операцией, если только оба указателя ссылаются на один и тот же массив (или, возможно, на позицию, следующую непосредственно за концом массива). Применение этой операции к указателям в двух различных массивах может дать какой-то результат, но может привести и к ошибке во время выполнения программы.

Сравнение указателей. Сравниваются как и обычные переменные.

Билет 41: Операции с указателями

Над указателями можно выполнять унарные операции: инкремент и декремент. При выполнении операций ++ и -- значение указателя увеличивается или уменьшается на длину типа, на который ссылается используемый указатель.

Пример:

int *ptr, a[10]; ptr=&a[5]; ptr++; /* равно адресу элемента a[6] */ ptr--; /* равно адресу элемента a[5] */

В бинарных операциях сложения и вычитания могут участвовать указатель и величина типа int. При этом результатом операции будет указатель на исходный тип, а его значение будет на указанное число элементов больше или меньше исходного.

Пример:

int *ptr1, *ptr2, a[10]; int i=2; ptr1=a+(i+4); /* равно адресу элемента a[6] */ ptr2=ptr1-i; /* равно адресу элемента a[4] */

В операции вычитания могут участвовать два указателя на один и тот же тип. Результат такой операции имеет тип int и равен числу элементов исходного типа между уменьшаемым и вычитаемым, причем если первый адрес младше, то результат имеет отрицательное значение.

Пример:

int *ptr1, *ptr2, a[10]; int i; ptr1=a+4; ptr2=a+9; i=ptr1-ptr2; /* равно 5 */ i=ptr2-ptr1; /* равно -5 */

Значения двух указателей на одинаковые типы можно сравнивать в операциях ==, !=, <, <=",">, >= при этом значения указателей рассматриваются просто как целые числа, а результат сравнения равен 0 (ложь) или 1 (истина).

Пример:

int *ptr1, *ptr2, a[10]; ptr1=a+5; ptr2=a+7; if (prt1>ptr2) a[3]=4;

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