Строки в функциях и процедурах
Стандартные и ваши собственные функции могут принимать строки в качестве парамет-
ров. Здесь, однако, есть некоторые тонкости.
Вы знаете, что если параметр функции объявлен как int a, то изменение переменной aв
функции никак не влияет на ее значение в вызывающей программе – функция создает копию переменной и работает с ней (для того, чтобы функция могла это сделать, надо объявить параметр как int &a). Это относится ко всем простым типам.Когда вы передаете в функция или процедуру строку, вы в самом деле передаете адресначала строки, никаких копий строки не создается. Поэтому всегда надо помнить, что При изменении строки-параметра в функции или процедуре меняется и соответствующая
строка в основной программе.Как же объявить строку-параметр в своей функции? В простейшем варианте – так же, как и массив символов: char s[]. А можно также и как указатель (все равно в функцию передается адрес строки char *s). Между этими двумя способами есть некоторая разница. В первом случае s– это имя массива символов, поэтому нельзя его изменять, а во втором случае – указатель на символ, который можно сдвигать, как хочется.__Все стандартные функции языка Си объявляют символьные строки как указатели – это дает большую свободу действий. Сравните, например, две реализации функции, которая копирует строки (аналогично strcpy). Первая выполнена с помощью параметра-массива, а вторая – с помощью указателя.
Как видите, вторая функция получилась более компактной. Применение указателей позволило не вводить дополнительную переменную, хотя и сделала программу менее ясной. Итак, в условии цикла whileстоит оператор присваивания. Если не обращать внимания на плюсы, он означает «взять символ по адресу s2и записать его по адресу s1». Двойные плюсы ПОСЛЕ s1и s2означают, что ПОСЛЕ выполнения присваивания оба указателянадо увеличить на единицу, то есть перейти к следующему символу.
Что же является условием цикла? Оказывается условие – это величина *s1, то есть код
символа по адресу s1. Когда же происходит проверка? Это зависит от расположения знаков++.В данном случае они стоят ПОСЛЕ имен переменных, поэтому операция инкремента выполняется ПОСЛЕ проверки условия. Проверка выполняется так: скопировали очередной символ,посмотрели на него, и если он – ноль (признак конца строки), то вышли из цикла. После этого увеличили указатели s1и s2. Обратите внимание, что после выхода из цикла увеличение указателей также происходит, и они будут указывать не на нули, завершающие строки, а на следующие байты в памяти.
Дата добавления: 2015-10-05; просмотров: 774;