netlib.narod.ru | < Назад | Оглавление | Далее > |
Одно свойство функций в Си, вероятно, будет новым для программистов, которые уже пользовались другими языками, в частности Фортраном. В Си все аргументы функции передаются «по значению». Это означает, что функция получает значения аргументов во временных переменных и не имеет доступа к оригиналам. Такой способ передачи аргументов отличается от «вызова по ссылке» в Фортране и спецификации параметра var в Паскале, которые делают доступными для подпрограммы сами аргументы, а не их локальные копии.
Однако вызов по значению следует отнести к достоинствам языка, а не к его недостаткам. Благодаря этому свойству обычно удается написать более компактную программу, содержащую меньшее число дополнительных переменных, поскольку параметры можно рассматривать как должным образом инициализированные локальные переменные вызванной подпрограммы. В качестве примера приведем еще одну версию функции power, в которой использовано это свойство.
/* power - возводит base в степень n; n>=0 */ /* Версия 2 */ power(int base, int n) { int p; for (p = 1; n > 0; --n) p = p * base; return p; }
Аргумент n используется как временная переменная; из него вычитается единица до тех пор, пока он не станет равен нулю. Переменная i здесь больше не нужна. Что бы ни происходило с n внутри power это никак не влияет на аргумент, копия которого была передана функции power при ее вызове.
При желании можно сделать так, чтобы функция смогла изменить переменную в вызывающей программе. Для этого в функцию необходимо передать адрес подлежащей изменению переменной (указатель на переменную), а также объявить соответствующий параметр как указатель и организовать через него косвенный доступ к этой переменной. Все, что касается указателей, мы рассмотрим в главе 5.
Для массивов ситуация несколько иная. Когда аргументом является имя массива, то функции передается значение, которое является адресом начала этого массива, и никакие элементы массива не копируются. С помощью индексирования относительно полученного значения функция может получить доступ к любому элементу массива. Разговор об этом пойдет в следующем параграфе.
netlib.narod.ru | < Назад | Оглавление | Далее > |