Основы программирования на C++, PASCAL
Продемонстрируем это правило на определенных выше указателях. Выполнение операторов
pti=pti+l; или pti++;
изменит значение указателя pti на 2, в результате чего он примет значение FFC2. В результате выполнения оператора pti--; значение указателя уменьшится на 2 и станет равным FFBE.
Аналогично для указателей других типов:
ptc++; увеличит значение указателя на 1;
ptf++; увеличит значение указателя на 4.
Использование указателей для передачи параметров функции. Рассматривая ранее правила использования функций, мы обращали внимание на то, что в языке Си возможна только односторонняя передача значений фактических параметров из вызывающей программы к формальным параметрам вызываемой функции. Возвращаемое значение несет сама функция, используемая в качестве операнда в выражении. Отсюда, казалось бы, следует неукоснительное правило: в процессе выполнения функции не могут изменяться значения переменных в вызывающей программе. Однако это правило можно обойти, если в качестве параметров функции использовать указатели.
В следующем примере функция swap() производит обмен значениями двух переменных величин, заданных своими указателями в аргументах.
void swap(int *a,int *b)
{ int с;
c=*a; *a=*b; *b=c;
}
Если в основной программе имеется следующий фрагмент:
int х=1,у=2;
swap(&x,&у) ;
printf("x=%d y=%d",x,y);
то на экран будет выведено:
х=2 у=1
т. е. переменные х и у поменялись значениями.
Все выглядит очень похоже на то, как если бы в Паскале использовали процедуру обмена с var-параметрами. И тем не менее передача параметров здесь тоже происходит по значению, только этими значениями являются указатели. После обращения к функции указатель а получил адрес переменной х, указатель b — адрес переменной у. После этого переменная х в основной программе и разадресованный указатель *а в функции оказываются связанными с одной ячейкой памяти; так же — у и *b.
Таким образом, можно сделать вывод о том, что использование указателей в параметрах функции позволяет моделировать работу процедур.
Указатели и массивы. Сейчас мы обсудим одно неожиданное обстоятельство в языке Си (неожиданное, с точки зрения человека, изучающего Си после Паскаля).
Имя массива трактуется как указатель-константа на массив.