Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_YaVU.docx
Скачиваний:
19
Добавлен:
12.02.2015
Размер:
4.4 Mб
Скачать

Виды указателей

  1. Указатель на void применяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить, не определен заранее. void *имя; Указатель на объектсодержит адрес области памяти, в которой хранятся данные определенного типа. тип *имя;int*a,b, *c; В качестве объекта может быть указатель.

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

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

Модификатор const, находящийся между именем указателя и звездочкой, относится к самому указателю и запрещает его изменение, аconstслева от звездочки задает постоянство значения, на которое он указывает.

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

Для инициализации указателей используется операция &.

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

  • Каждый указатель должен быть инициализирован до своего первого упоминания.

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

Вопрос № 9. Операции с указателями (разадресация, взятие адреса, арифметические операции: сложение с константой, разность двух указателей, инкремент, декремент, сравнение указателей; приведение типов).

  • Разадресация, или косвенное обращение к объекту (*);

  • Присваивание;

  • Сложение с константой;

  • Вычитание;

  • Инкремент (++);

  • Декремент (--);

  • Сравнение;

  • Приведение типов;

  • Получение адреса (&).

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

Результат операции имеет тип совпадающий с типом указателей.

Эту операцию можно использовать как для получения, так и для изменения значения величины (если она не объявлена как константа).

Неопределенный результат:

  • указатель является нулевым – NULL;

  • указатель определяет адрес не активного объекта;

  • указатель определяет адрес, который не приведен до типа объекта на который он указан;

  • указатель определяет адрес, не используемый выполняемой программой.

2. Получение адреса(&) – возвращает адрес объекта, стоящий после него.

  • int a=5;

  • int *p, *q;

  • p=&a;

  • q=&p;

  • a=7;

  • *p=7;

  • *(*q)=7;

Операция применима к величинам, имеющим имя и размещенным в оперативной памяти.

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

Инкремент (++) перемещает указатель к следующему элементу массива,декремент (--) – к предыдущему. Фактически значение указателя изменяется на величинуsizeof(тип). Если указатель на определенный тип увеличивается или уменьшается на константу, его значение изменяется на величину этой константы, умноженной на размер объекта данного типа.

Разность двух указателей – это разность их значений, деленная на размер типа в байтах. Суммирование двух указателей не допускается.

Сравнение указателей >, <, >=, <=, ==, !=

  1. Синтаксис операции явного приведения типа: перед именем переменной в скобках указывается тип, к которому ее требуется преобразовать. При смешивании в выражении указателей разных типов явное преобразование типов требуется для всех указателей, кромеvoid*.

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

  • указателям типа void*;

  • Если тип указателей справа и слева от операции присваивания один и тот же.

Вопрос № 10. Одномерные массивы, нумерация элементов, инициализация массива. Доступ к элементу массива. Динамические массивы.

Массив– это группа элементов одного типа.

тип имя[const];

Количество элементов можно не писать, если массив при объявлении инициализируется.

Примеры:

intb[5];

intc[]={1,2,3};

Идентификатор массива является константным указателем на его нулевой элемент.

Можно описать указатель, присвоить ему адрес начала массива и работать с массивом через указатель. Следующий фрагмент программы копирует все элементы массива aв массивb:

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