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

7.2. Использование значений параметров по умолчанию

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

Основные правила при использовании значений параметров по умолчанию:

  • если в определении функции параметр имеет умалчиваемое значение, то все параметры, которые следуют за ним, должны иметь умалчиваемые значения;

  • если при вызове параметр с умалчиваемым значением отсутствует, то все параметры, которые следуют за ним, должны также отсутствовать.

Пример функции:

int summa(int a, int b=10, int c=5) // Параметры b и c имеют умалчиваемые значения

{

return a+b+c;

}

Примеры вызовов этой функции:

int i=2, j=5, s1, s2, s3;

s1=summa(i, 2, j); // Все параметры присутствуют s1=2+2+5=9

s2=summa(i, j); // Параметр с отсутствует s2=2+5+5=12

s3=summa(i); // Параметры b и c отсутствуют s3=2+10+5=17

7.3. Изменение значений скалярных параметров в функциях

7.3.1. Передача параметров в функции по значению

Рассмотрим пример, когда функция пытается изменить значение своего параметра.

void MyFun(int a)

{

a=100;

}

void main()

{

int a=10;

MyFun(a);

printf("a=%d", a); // Будет напечатано a=10

}

В данном примере, несмотря на то, что функция меняет значение параметра, на печать будет выведено старое значение фактического параметра – переменной a, т.е. изменение, которое произвела функция с параметром, после выхода из функции не сохраняется. Это происходит потому, что при передаче параметров в функцию создаются копии параметров в стеке (также все локальные переменные функции размещаются в стеке), и функция работает не с исходной переменной, а с копией этой переменной в стеке. При выходе из функции место в стеке, где размещены параметры функции и ее локальные переменные, освобождается и все изменения пропадают. Данный процесс демонстрирует рисунок, представленный ниже.

Примечание. Стек (англ. stack — стопка) — структура данных, в которой доступ к элементам организован по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»). В оперативной памяти выделяется специальный сегмент стека для временного хранения данных, который работает по такому же принципу.

На рисунке показано, что исходная переменная a может размещаться как в стеке – в данном примере, так оно и есть, так как переменная a локальная переменная функции main, так и за пределами стека, если бы a была бы глобальной переменной, в данном случае это не имеет значение, так как все равно функция работает с копией a.

Такой механизм передачи параметров в функцию называется передача параметров по значению (в стек копируется значение параметра).

7.3.1. Передача параметров в функции по указателю (по ссылке)

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

#include <stdio.h>

void MyFun(int* pa)

{

*pa=100;

}

void main()

{

int a=10;

MyFun(&a);

printf("a=%d", a); // Будет напечатано a=100

}

В этом примере значение переменной a будет изменено, так как в этом случае в стек помещается не копия переменной a, а адрес переменной, при выполнении операции обращение по адресу внутри функции, новое значение будет записано по адресу исходной переменной а и переменная будет изменена. Данный процесс демонстрируется на рисунке.

Такой механизм передача параметров называется передача параметров по указателю.

Таким образом можно сделать вывод, для того чтобы функция могла изменить значение параметра, параметр должен передаваться по указателю, т.е. в функцию необходимо передавать адрес исходного объекта (переменной).

Примечание. Поэтому в стандартной функции ввода scanf и некоторых других функциях при вызове передается адрес переменной (используется операция &).

В языке Си++ появился новый тип – ссылки. В некоторых случаях их удобно использовать вместо указателей в качестве параметров функции, так как ссылка, по сути, является указателем, но к ней не надо применять операцию обращения по адресу («*»). В представленном ниже примере функция также меняет значение параметра.

#include <stdio.h>

void MyFun(int& la) // Параметр функции - ссылка

{

la=100; // Не нужно применять операцию – обращение по адресу

}

void main()

{

int a=10;

MyFun(a); // При вызове не нужно получать адрес

printf("a=%d", a); // Будет напечатано a=100

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]