ВУЗ:
Составители:
65
sizeof(int) байт (4 байта для процессора Pentium), а если это
указатель на char, смещение происходит на 1 байт (sizeof(char)).
Возможность изменения переменной-указателя удобно использовать ,
например, для прохода по элементам массива. Нашу функцию spacetoul из
п . 6.2.2 мы могли бы написать и так :
void spacetoul(char *str)
{
char *p;
for(p = str ; *p ; p++)
if(*p == ‘ ‘)
*p = ‘_’;
}
Здесь указатель p последовательно «пробегает» по всем символам
строки, пока не встретится нуль (не сработает проверка *p).
Иногда операции автоинкремента/ автодекремента указателя
применяют вместе с разыменованием . Здесь надо помнить , что приоритет
операций ++ и – выше, чем операции *, и в конструкциях
*p++ ++*p *p-- --*p
изменяется не значение, а указатель, а * уже позволяет выбрать значение
до или после изменения указателя. Чтобы изменить не указатель, а
значение, *p необходимо заключить в скобки, например (*p)++.
Указатели можно сравнивать на больше и меньше. Тот указатель из
двух, который указывает на ячейку с большим относительным индексом,
всегда больше.
Сложение и вычитание двух указателей – операция в общем случае
бессмысленная . Однако , пользуясь тем , что указатели реально содержат
адреса ячеек памяти компьютера, выраженные в байтах , можно привести 2
указателя к типу int и получить разницу в байтах . Затем , зная размер типа
указателя, можно узнать и расстояние между ними, выраженное в
количестве ячеек данного типа.
Например, если m – массив типа int, а p – указатель на какой-то из
его элементов, то индекс этого элемента можно определить из выражения
((int)p – (int)(void *)m)/sizeof(int)
65 sizeof(int) байт (4 байта для процессора Pentium), а если это указатель на char, смещение происходит на 1 байт (sizeof(char)). Возможность изменения переменной-указателя удобно использовать, например, для прохода по элементам массива. Нашу функцию spacetoul из п. 6.2.2 мы могли бы написать и так: void spacetoul(char *str) { char *p; for(p = str ; *p ; p++) if(*p == ‘ ‘) *p = ‘_’; } Здесь указатель p последовательно «пробегает» по всем символам строки, пока не встретится нуль (не сработает проверка *p). Иногда операции автоинкремента/автодекремента указателя применяют вместе с разыменованием. Здесь надо помнить, что приоритет операций ++ и – выше, чем операции *, и в конструкциях *p++ ++*p *p-- --*p изменяется не значение, а указатель, а * уже позволяет выбрать значение до или после изменения указателя. Чтобы изменить не указатель, а значение, *p необходимо заключить в скобки, например (*p)++. Указатели можно сравнивать на больше и меньше. Тот указатель из двух, который указывает на ячейку с большим относительным индексом, всегда больше. Сложение и вычитание двух указателей – операция в общем случае бессмысленная. Однако, пользуясь тем, что указатели реально содержат адреса ячеек памяти компьютера, выраженные в байтах, можно привести 2 указателя к типу int и получить разницу в байтах. Затем, зная размер типа указателя, можно узнать и расстояние между ними, выраженное в количестве ячеек данного типа. Например, если m – массив типа int, а p – указатель на какой-то из его элементов, то индекс этого элемента можно определить из выражения ((int)p – (int)(void *)m)/sizeof(int)
Страницы
- « первая
- ‹ предыдущая
- …
- 63
- 64
- 65
- 66
- 67
- …
- следующая ›
- последняя »