Программирование 07
.pdfУказатели и массивы. Адресная арифметика
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