ВУЗ:
Составители:
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
- …
- следующая ›
- последняя »
