Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование 07

.pdf
Скачиваний:
8
Добавлен:
26.03.2015
Размер:
252.21 Кб
Скачать

Указатели и массивы. Адресная арифметика

15.10.13

Указатели

Указатели очень широко используются в языке программирования C — частично потому, что некоторые операции нельзя выполнить без их помощи, а частично потому, что их использование позволяет писать очень эффективные программы.

Между указателями и массивами существует тесная связь — на этой лекции мы её рассмотрим.

15.10.13

Указатели и адреса

Типичная компьютерная система содержит массив последовательно пронумерованных (адресуемых) ячеек памяти, с которыми можно работать по отдельности либо группами.

Так, один байт (ячейка) может хранить переменную типа char, два — short, четыре

— long (например).

15.10.13

Указатели и адреса

Например, с — переменная типа char, p — указатель, который на неё указывает (хранит её адрес в памяти).

Условно это выглядит так:

15.10.13

Указатели и адреса

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

& - в С это одноместная операция взятия адреса, она позволяет получить адрес объекта.

15.10.13

Указатели и адреса

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

char c;

char *p; // указатель на тип char p = &c; // теперь p хранит адрес с // (указывает на c)

15.10.13

Указатели и адреса

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

Для этого служит одноместная операция

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

* - это операция ссылки по указателю в C;

15.10.13

Указатели и адреса

Ещё один пример: int i;

int *p; // указатель на тип int

p = &i; // теперь p хранит адрес с // (указывает на c)

*p = 5; // теперь i = 5

// Обратите внимание! Не p = 5!

Таким образом выражение

i == *p в этом примере истинно.

15.10.13

Указатели и адреса

Ещё один пример:

int x = 1, y = 2, z[10]; int *ip; // указатель на int

ip = &x; // ip указывает на x y = *ip; // y теперь равно 1 *ip = 0; // x теперь равно 0

ip = &z[0]; // ip теперь указывает на z[0]

15.10.13

Указатели и адреса

Следует заметить, что что любой указатель может указывать только на объект конкретного типа, указанного при определении.

Исключением являются указатели типа void *, которые могут содержать адрес объекта любого типа.

Ещё примеры указателей: void *vp;

int *ip, *ip2; long *lp; double *dp;

15.10.13