Языки программирования для численных методов. Глушакова Т.Н - 65 стр.

UptoLike

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)