Новосибирский Государственный Университет
Опубликован: 26.08.2005 | Доступ: свободный | Студентов: 17110 / 2712 | Оценка: 4.07 / 3.55 | Длительность: 13:11:00
ISBN: 978-5-9556-0057-4
Лекция 9:

Функции

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >

Подведем итоги по указателям

Когда за знаком & следует имя переменной, результатом операции является адрес указанной переменной.

Когда за знаком * следует указатель на переменную, результатом операции является величина, помещенная в ячейку с указанным адресом.

Пример:

age = 105;
ptr =&age;/*указатель на age*/
val= *ptr;

Результатом выполнения этого фрагмента является присваивание значения 105 переменной val.

Типичное определение функции имеет следующий вид:

имя (список аргументов)
описание аргументов
тело функции

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

Аргументы используются для передачи значений из вызывающей программы в функцию. Использование ключевого слова return позволяет передавать в вызывающую программу одно значение из вызываемой функции. Обычно выполнение функции не оказывает никакого влияния на значения переменных вызывающей программы. Чтобы иметь возможность непосредственно изменять значения переменных вызывающей программы, необходимо использовать указатели в качестве аргументов. Это может оказаться необходимым в случае, если в вызывающую программу требуется передать более чем одно значение.

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

Функции с переменным количеством аргументов

В языке Си допустимы функции, количество аргументов у которых при компиляции функции не фиксировано. Количество и тип аргументов становится известным только в момент вызова функции, когда явно задан список фактических аргументов (параметров). При определении и описании таких функций, имеющих списки параметров неопределенной длины. Спецификация формальных параметров заканчивается запятой и многоточием:

тип имя(спецификация-явных-параметров,...);

Здесь тип - тип возвращаемого функцией значения; имя - имя функции.

Спецификация явных параметров - список спецификации параметров, количество и типы которых фиксированы и известны в момент компиляции. Эти параметры обязательны. Каждая функция с переменным количеством параметров должна иметь хотя бы один обязательный параметр. После списка явных (обязательных) параметров ставится запятая, а затем - многоточие. Компилятор знает, что дальнейший контроль соответствия количества и типов параметров при обработке вызова функции проводить не нужно. Чтобы функция с переменным количеством параметров могла воспринимать параметры различных типов, необходимо в качестве исходных данных каким-то образом передавать ей информацию о типах параметров.

Пример:

#include <stdio.h>
/* Функция суммирует значения своих параметров */
long summa(int m,...) /*m - число параметров*/
{
	int *p=&m; /*настроили указатель на параметр m*/
	long t=0;
	for(;m>0;m--) t+=*++p;
	return t;
}
void main()
{
	printf("\n summa(2,6,4)=%d",summa(2,6,4));
	printf("\n summa(6,1,2,3,4,5,6)=%d", summa(6,1,2,3,4,5,6));
}
< Лекция 8 || Лекция 9: 1234 || Лекция 10 >
Вадим Ратьков
Вадим Ратьков

Объясните, пожалуйста, чем отличаются два этих кода?

printf("смешанное деление: 7./4 это %2.2f \n", 7./4);

и

printf("смешанное деление: 7./4 это %f \n", 7./4);

%f  это, понятное дело, float. А что такое %2.2f ?

Вопрос возник при прочтении лекции 3 часть вторая курса Основы программирования на языке C.

http://www.intuit.ru/studies/courses/43/43/lecture/1281?page=2

Анна Алексанина
Анна Алексанина

Я хочу выполнить одну из программ, которые есть в лекции. Но для этого мне надо компилировать текст, а я не знаю, как это сделать. ОС Windows.

Владислав Лиховид
Владислав Лиховид
Украина, Суми, Сумду
Ильсияр Нигаматьянова
Ильсияр Нигаматьянова
Россия, село Верхние Татышлы