- •Рецензенты:
- •Лекция 1 Основные понятия языка с
- •Первая программа
- •Переменные языка с
- •Имя переменной
- •Объявление константы
- •Операции языка с
- •Лекция 2 Операторы языка с Условный оператор
- •Оператор switch
- •Циклы Цикл for
- •Циклы while и do-while
- •Оператор безусловного перехода
- •Использование операторов break, continue и goto в циклах
- •Операция условие ?
- •Лекция 3 Массивы
- •Инициализация массивов
- •Массивы символов. Строки
- •Функции для работы со строками
- •Лекция 4 Указатели
- •Объявление указателей
- •Операции над указателями
- •Связь указателей и массивов
- •Массивы указателей
- •Инициализация указателей
- •Лекция 5 Функции языка с
- •Объявление функции
- •Оператор return
- •Прототипы функций
- •Функции c произвольным числом параметров
- •Область действия и область видимости переменной
- •Классы памяти
- •Параметры и аргументы функции
- •Лекция 6 Типы, определяемые пользователями
- •Структура
- •Перечислимый тип
- •Переименование типов-typedef
- •Лекция 7 Модели памяти и препроцессор языка с Модели памяти
- •Препроцессор языка с
- •Директива #define
- •Список рекомендуемой литературы
- •Оглавление
- •Программирование на языках высокого уровня: с
- •428015 Г.Чебоксары, Московский просп., 15
Прототипы функций
Особенностью стандарта ANSI языка С является то, что для создания правильного машинного кода функции ему необходимо сообщить до ее первого вызова тип возвращаемого результата, а также количество и типы аргументов. Для этой цели в С используется понятие прототипа функции. Прототип функции задается следующим образом: тип <имя функции>(список параметров);
Использование прототипа функции является объявлением функции (declaration). Чаще всего прототип функции полностью совпадает с заголовком в описании функции, хотя это и не всегда так. При объявлении функции компилятору важно знать имя функции, количество и тип параметров и тип возвращаемого значения. При этом имена формальных параметров функции не играют никакой роли и игнорируются компилятором. Поэтому прототип функции может выглядеть или:
int func(int a, float b. chai* с);
или:
int func(int, float, char*);
Два этих объявления абсолютно равносильны. Рассмотрим пример.
Программа 5.7:
# include <stdio.h>
float sqr(floal a); /* •этo прототип функции, объявление функции */
void main()
{ float b; b= 5.2;
printf( "Квадрат числа %f равен %f", b, sqr(b)); }
f1oal sqr( float a) /* Это описание функции */
{return}a*a; }
Cледующие два примера использования функций вызовут сообщения об ошибке при компиляции. В первом примере препятствием для компиляции будет несоответствие возвращаемого значения объявленному типу функции. Языки С и С++ автоматически преобразуют данные к другому типу, но только тогда, когда это возможно. Целый тип не может быть автоматически преобразовываться в указателе на целое.
Программа 5.8:
# include <stdio.h>
/* Неправильный пример*/
int *sqr(int *i) /* Прототип функции */
main()
{int i;
sqr(&x);}
int *sqr(int *i) /* Объявление функции */
{return *i = (*i)*(*i);}
Программа 5.9:
//правильный вариант
# include <stdio.h>
int*-sqr(int* i);
void main ()
{ intx=10, *p;
p=&x;
printf(“address ofx= %p \n", p);
printf(“value in x= %d \n", *p);
p=sqr(р);
printf(“address of sqr(p)= %p \n", p);
printf(" value in sqr(p)= %d \n", *p);
}
int* sqr(int* i)
{
// printf(“address of I= %p \n", i);
*i=((*i)*(*i));
printf(“address of I= %p \n", i);
printf(" value in i^2 = %d \n", *i);
return i;
Результат выполнения программы
address of x=4В07:2256
value in x=10
address of I=4B07:2256
value in i^2=100
address of sqr(p)= 4B07:2256
value in sqr(p)= 100
Программа 5.10:
# include <stdio.h>
/* Неправильный пример*/
int sqr(int *i); /* прототип функции */
main()
{ int x=10);
sqr (&x,10); /* Несоответствие количества аргументов */
{int sqr(int*i)
*i = (*i)*(*i)
Обратим внимание на то, что если мы исправим эти программы, то функция будет возвращать квадрат числа i не через значение функции, а через параметр функции.
Если функция не имеет аргументов, то при объявлении прототипа такой функции следует вместо аргументов писать ключевое слово void. В старом стандарте языка С, который должен поддерживаться новыми компиляторами, отсутствие аргументов в скобках не говорило об их отсутствии в данной функции вообще. Чтобы не было недоразумений или путаницы, желательно использовать ключевое слово void, если параметры у функции отсутствуют.
Это должно касаться и функции main(). Ее объявление должно иметь вид void main(void) или main(void).
Программа 5.11:
#include <stdio.h>
void line_ (void); /* прототип функции */
main (void) {
line_ (); }
void line _(void)
for (i=0; i<80;i++)рrintf ("-");
}
Мы уже говорили о стандартных заголовочных файлах (header Files). Заголовочные файлы языка С содержат два типа информации: первый - это отдельные определения, которые используются функциями. Второй - это прототипы функций, относящиеся к этому заголовочному файлу. Примерами таких заголовочных файлов являются файлы sidio.h, string. h. conio.h и др.
