netlib.narod.ru< Назад | Оглавление | Далее >

1.8. Аргументы. Вызов по значению

Одно свойство функций в Си, вероятно, будет новым для программистов, которые уже пользовались другими языками, в частности Фортраном. В Си все аргументы функции передаются «по значению». Это означает, что функция получает значения аргументов во временных переменных и не имеет доступа к оригиналам. Такой способ передачи аргументов отличается от «вызова по ссылке» в Фортране и спецификации параметра 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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz