В языке C существует два способа передачи параметра в функцию: передача по имени и передача по ссылке. Кроме того, функция может в процессе работы изменять значения глобальных переменных программы.
Если используется передача по имени, то при вызове функции в качестве фактического параметра указывается имя переменной, и в стеке выделяется место для формального параметра, куда копируется значение фактического параметра функции. Далее функция работает только со значением параметра в стеке. При выходе из функции стек очищается и данные значения, даже если они были модифицированы функцией, теряются. В языке C вызванная функция не может изменить значения переменных, указанных в качестве фактических параметров функции, передаваемых по имени при обращении к ней. После выхода из функции значение переменной будет таким, каким оно было до входа в функцию.
Если необходимо, чтобы функция могла изменять значения переменных, переданных ей в качестве фактических параметров, используют передачу параметров в функцию по ссылке. В этом случае в качестве фактического параметра указывается адрес переменной, который и заносится в стек. Вызванная функция обращается с параметром через адрес, находящийся в стеке, тем самым работая с основной переменной, а не с её копией. После выхода из функции значение переменной будет таким, каким оно было при выходе из функции.
Если в качестве параметра функции используется массив, то его можно передать в качестве параметра в функцию только по ссылке, в этом случае передается указатель на первый элемент массива. При указании многомерного массива в качестве фактического параметра функции лучше всего явно указывать его размеры по всем координатам, или передавать указатель на первый элемент массива.
В функцию в качестве параметра может быть передано имя другой функции, которое может быть использовано в процессе выполнения.
Пример 7
void increment(int a, int *c)
{
a++;
(*c)++;
printf("%d %d ",a,*c);
}
void main(void)
{
int i=2,k=8;
increment(i,&k);
printf("%d %d",i,k);
}
На экране будет напечатано: 3 9 2 9
Пример 8
int abs_sum(int a, int b, int modul(int))
{
return modul(a)+modul(b);
}
int absolute(int x)
{
return x>=0?x:-x;
}
void main(void)
{
printf("%d ",abs_sum(-2,5,absolute));
}
На экране будет напечатано: 7
Параметры и возвращаемое значение функции main()
Функция main() может иметь или не иметь параметры и возвращать или не возвращать значение. Если она не имеет параметров или не возвращает значение, то в соответствующем поле указывается слово void.
Функция main() может иметь параметры, фактические значения которых могут быть переданы ей из командной строки или из другой программы при запуске программы на выполнение. В языке C имеются два встроенных параметра функции main(): int argc и char *argv[]. Использование именно таких идентификаторов не обязательно, но обязателен тип и порядок параметров. Эти параметры используются для передачи параметров командной строки. Параметр argc содержит количество параметров командной строки и имеет тип int. Он всегда не меньше единицы, так как имя программы, вызываемой для выполнения, трактуется как первый параметр командной строки. Параметр argv является указателем на массив строк. Каждый элемент массива содержит соответствующий параметр командной строки, один параметр командной строки отделяется от другого пробелом. Если в качестве параметра необходимо иметь строку, содержащую пробел, её необходимо заключить в кавычки. Если параметром командной строки является число, то оно рассматривается как строка и должно быть преобразовано с использованием специальных библиотечных функций.
В среде Borland C++ 3.1 предусмотрен ещё и третий параметр: char *env[]. Этот параметр используется для доступа к параметрам среды операционной системы (переменные окружения) и является указателем на массив строк, которые содержат эти параметры.
Параметры функции main() позиционно зависимы, то есть при использовании какого-либо параметра должны быть объявлены и все предыдущие параметры, но необязательно объявлять последующие параметры.
Функция main() может возвращать в ОС или вызывающую программу значение типа int. Для ОС MS-DOS возврат нулевого значения говорит об успешном завершении, возврат значения, отличного от нуля, говорит об аварийном завершении.
Пример 9
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
for(int i=0;i<argc;i++)
printf("%s\n",argv[i]);
for(int i=0;env[i];i++)
printf("%s\n",env[i]);
return 0;
}
Данная программа, запущенная на выполнение в ОС MS-DOS, напечатает на экране командную строку MS-DOS, введённую при её запуске, и список переменных окружения. Если после неё ввести командную строку MS-DOS
if errorlevel 0 exit
то произойдёт перезагрузка ОС.