
- •Структура простой программы на языке Си
- •Краткие теоретические сведения
- •Операции языка Си
- •Краткие теоретические сведения
- •Работа с текстовой информацией и с массивами
- •Краткие теоретические сведения
- •Функции в языке Си
- •Краткие теоретические сведения
- •Структуры, объединения, битовые поля
- •Краткие теоретические сведения
- •Управление файлами в языке Си
- •Краткие теоретические сведения
Функции в языке Си
Овладение навыками алгоритмизации и программирования задач с использованием подпрограмм пользователя различных видов.
Краткие теоретические сведения
Подпрограммы в языке Си организуются в виде функций. Функции состоят из тела и заголовка. Общее описание заголовка: тип функции:
имя функции (список аргументов)
Тип_функции - это тип возвращаемого функцией значения. По умолчанию типом функции считается int.
Имя_функции составляется по правилам, установленным для идентификаторов.
Список_аргументов - либо пустой список, либо множество пар "тип_аргумента имя_аргумента", отделенных друг от друга запятыми.
Тело функции - это множество операторов, реализующих функцию и заключенных в операторные скобки .
Пример:
#include <stdio.h> int func (int a, int b)
{
printf ("%d+%d=%d", a,b,(a+b)); return (a+b);
}
void main ()
{
int x=5,y=7,z;
z=func (x,y);
printf("Вот результат работы функции func: %d",z);
}
Для возврата значений из вызываемой функции в вызывающую используется оператор return, аргументом которого является выражение. Выражение должно иметь тот же тип, что и сама функция.
Если функция не должна возвращать значение, она должна иметь тип void. Аналогично поступают и при отсутствии у функции аргументов: вместо списка аргументов указывается ключевое слово void.
Полное определение вызываемой функции может находиться как до вызывающей функции, так и после, а также может располагаться в другом файле или в библиотеке функций. Чтобы не возникало проблемы ссылок вперед, любая функция должна быть описана до своего использования. Описание организуется в виде прототипа. В прототипе приводится тип функции, ее имя, количество аргументов, их типы и порядок следования. Пример прототипа для функции func:
int func (int, int);
Для удобства прототипы нескольких функций объединяют в заголовочные файлы, имеющие расширения *.h или *.hpp.
Способы передачи параметров в функции
В языке Си имеется два способа передачи параметров:
- по значению;
- по указателю, или по адресу.
Второй способ применяют в том случае, если входной параметр должен быть обработан функцией и возвращен в измененном виде. В противном случае используется передача по значению.
Особенности передачи и обработки массивов и строк
Массивы и строки передаются в функции по указателю. Это может быть сделано явным образом:
int MatrixSum (int *Array, int rows, int cols)
{
int Sum=0;
for (int i=0 ;i<rows; i++) for (int j=0 ;j<cols; j++)
Sum+= *(Array+i*cols+j); // Доступ к Array[i][j]
return Sum;
},
либо неявно:
int MatrixSum (int Array [][10], int rows)
{
int Sum=0;
for (int i=0 ;i<rows; i++) for (int j=0 ;j<10; j++)
Sum+= Array[i][j]; // Доступ к Array[i][j]
return Sum;
}.
В первом случае функция ничего не знает ни о количестве размерностей массива, ни о количестве его элементов, эти данные должны передаваться дополнительно (rows, cols). Доступ к элементам организуется через операцию косвенной адресации *. Преимуществом второго способа является возможность использования операции индексирования []. При этом, как видно из примера, максимальный индекс по одной из размерностей может быть опущен.
Функция main также может возвращать DOS целочисленные значения. Пример программы:
#include <stdio.h>
int main (int argc, char *argv[])
{
printf ("В массиве argv имеется %d элементов!")
for (int i=0;i<argc;i++)
printf ("\n %d - %s",i,argv[i]);
return 0; //Успешное завершение программы
}
Классы памяти. Область видимости переменных
Область видимости переменной ограничивается той парой операторных скобок, в которой она была объявлена.
Класс памяти переменной определяет область ее действия и продолжительность использования. Класс памяти определяется местом задания переменной и соответствующим ключевым словом. Переменные, определенные вне функции, имеют глобальную область действия и являются внешними. Переменные, описанные внутри функции, являются автоматическими и локальными, если не используется какое-либо другое ключевое слово. Внешние переменные, определенные ранее функции, известны ей, даже если они не описаны внутри нее.
Переменные классов памяти auto, register, static описываются внутри функции, а все прочие - вне какой-либо функции (табл. 3).
Таблица 3 - Переменные классов памяти
Класс памяти |
Ключевое слово |
Продолжительность существования |
Область действия |
Автоматический |
Auto |
Временно |
Локальная |
Регистровый |
Register |
Временно |
Локальная |
Статический |
Static |
Постоянно |
Локальная |
Внешний |
Extern |
Постоянно |
Глобальная (все файлы проекта) |
Внешний |
extern static |
Постоянно |
Глобальная статический (один файл) |