Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
61.doc
Скачиваний:
131
Добавлен:
11.05.2015
Размер:
451.58 Кб
Скачать

43. Аргументы функции: формальные и фактические. Передача аргументов, стек.

Если функция имеет аргументы, значит должны быть объявлены переменные, которые примут их значения. Эти переменные называются формальными параметрами функции. Внутри функции они фигурируют как обычные локальные переменные. Они объявляются после имени функции внутри круглых скобок.

Внутри функции формальные параметры ничем не отличаются от обычных локальных переменных, единственное их отличие состоит в том, что при входе в функцию они получают значение аргументов. Можно, например, присваивать параметру какое-либо значение или использовать его в выражении. Как и локальные переменные, формальные параметры тоже являются динамическими переменными, и, следовательно, разрушаются при выходе из функции.

Функция – это самостоятельная единица программы, созданная для решения конкретной задачи.

Формальные параметры – это параметры, которые мы объявляем в заголовке функции при описании.

Фактические параметры – это параметры, которые мы подставляем при вызове функции.

voidmyfunc(intx); // объявление функции

void main(viod)

{

int a=5;

myfunc(a); // а – фактический параметр

}

//Описание функции

voidmyfunc(intx) //x– формальный параметр

{

x=x+10;

printf(“Вывод х=%d”,x);

}

Если функция должна принимать аргументы, то в ее объявлении следует декларировать параметры, которые примут значения этих аргументов. Объявления параметров стоят после имени функции.

/* Возвращает 1, если символ c входит в строку s;

и 0 в противном случае. */

int is_in(char *s, char c)

{

while(*s)

if(*s==c) return 1;

else s++;

return 0;

}

Функция is_in() имеет два параметра s и с. Если символ с входит в строку s, то эта функция возвращает 1, в противном случае она возвращает 0.

Хотя параметры выполняют специальную задачу, - принимают значения аргументов, передаваемых функции, - они все равно ведут себя так, как и другие локальные переменные. Формальным параметрам функции, например, можно присваивать какие-либо значения или использовать эти параметры в каких-либо выражениях.

В языках программирования имеется два способа передачи значений подпрограмме. Первый из них – вызов по значению. При его применении в формальный параметр подпрограммы копируется значение аргумента. В таком случае изменения параметра на аргумент не влияют.

Вторым способом передачи аргумента подпрограмме является вызов по ссылке. При его применении в параметр копируется адрес аргумента. Это значит, что, в отличие от вызова по значению, изменения значения параметра приводят к точно таким же изменениям значения аргумента.

За небольшим количеством исключений, в языке С для передачи аргументов используется вызов по значению.

#include <stdio.h>

int sqr(int x);

int main(void)

{

int t=10;

printf("%d %d", sqr(t), t);

return 0;

}

int sqr(int x)

{

x = x*x;

return(x);

}

В этом примере в параметр х копируется 10 – значение аргумента для sqr(). Когда выполняется присваивание х=х*х, модифицируется только локальная переменная х. А значение переменной t, использованной в качестве аргумента при вызове sqr(), по-прежнему остается равным 10. Поэтому выведено будет следующее: 100 10.

Вызов по ссылке

Хотя в С для передачи параметров применяется вызов по значению, можно создать вызов и по ссылке, передавая не сам аргумент, а указатель на него. Указатель передается так, как и любой другой аргумент. Конечно, в таком случае параметр следует декларировать как один из типов указателей.

Стек представляет собой упорядоченный набор элементов, доступ к которым осуществляется только с одного конца, называемого вершиной стека.