- •Основы алгоритмизации и программирования, язык Си
- •Введение
- •Блок-схема алгоритма Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Операции и выражения
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора Директива #include
- •Директива #define
- •Понятие пустого и составного операторов
- •Условные операторы
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Операторы перехода (break, continue, return, goto)
- •Примеры программ
- •Массивы Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Параметры по умолчанию
- •Передача массива в функцию
- •Inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Доступ к элементам структуры
- •Инициализация структур
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Примеры программ
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Потоки и файлы
- •Файлы Основные сведения о файловой системе
- •Организация посимвольного ввода и вывода
- •Определение конца файла feof()
- •Организация ввода и вывода строк
- •Удаление файлов
- •Дозапись потока
- •Позиционирование в файле
- •Текстовые и двоичные файлы
- •Функции fread() и fwrite()
- •Примеры программ
- •Хеширование
- •Схемы хеширования
- •Метод открытой адресации с линейным опробыванием
- •Метод цепочек
- •Машинное представление графов
- •Примеры программ
- •Литература
Параметры функции
Параметры в списке аргументов различаются на формальные и фактические. Фактические параметры - это параметры, формируемые в вызывающей функции и передаваемые в списке при вызове функции. Формальные - это параметры, описываемые в списке параметров вызываемой функции. Порядок и типы формальных параметров должны быть одинаковыми в определении функции и во всех ее объявлениях. Типы фактических параметров при вызове функции должны быть совместимы с типами соответствующих формальных параметров.
void fun(int,char,double); // прототип функции
imt k; // глобальная переменная
main()
{ int n=1;
char c=’a’;
fun(n,c,1.5); // n, c, 1.5 фактические параметры
}
void fun(int nn, char cc, double dd) // nn, cc, dd формальные параметры
{
. . .
}
В функцию параметры могут передаваться следующими способами:
- используя глобальные переменные, что соответствует неявной передаче параметров;
- используя в качестве формального параметра ссылки;
- по значению, посредством копирования некоторого значения фактического параметра в формальный;
- используя в качестве параметров (фактического и формального) адреса.
В первом и втором случаях любое изменение формального параметра приводит к изменению фактического, а в третьем изменение формального параметра не влияют на значение фактического.
Аргументы функции, передаваемые в функцию по значению, являются локальными переменными. Это значит, что при передаче аргументов в функцию создаются их локальные копии, с которыми работает функция, то есть если в функции изменяется значение аргумента, то изменяется не переменная, которую передали функции в качестве аргумента, а её локальная копия:
#include <stdio.h>
void func(int x,int y);
main()
{ int x=1,y=2;
printf("\nmain() : x= %d y= %d",x,y);
func(x,y);
printf("\nmain() : x= %d y= %d",x,y);
return 0;
}
void func(int x,int y)
{ printf("\nfunc() : x= %d y= %d",x,y);
x=3;
y=4;
printf("\nfunc() : x= %d y= %d",x,y);
}
результат выполнения:
main(): x=1 y=2
func(): x=1 y=2
func(): x=3 y=4
main(): x=1 y=2
Если значение формального параметра передается в функцию по адресу, то, как и в первых двух случаях любое изменение значения по переданному в функцию адресу влияет на значение переменной, адрес которой передан в функцию в качестве фактического параметра.
Областью действия имени считается часть программы, в которой это имя можно использовать. Для автоматических переменных область действия - функция, в которой они описаны. Локальные (автоматические) переменные разных функций, имеющие одинаковые имена, не являются связанными друг с другом.
Область действия внешней переменной или функции распространяется от места ее декларирования до конца файла, в котором они расположены. Если же на внешнюю переменную требуется сослаться до того, как она определена, или если она определена в другом файле, то при ее декларировании используется слово extern.
Например, если декларации вида
int i;
float mas[5];
расположены вне всех функций, то они определяют внешние переменные i и mas, то есть декларирование и выделение памяти под эти объекты выполнено для остальной части файла. В то же время инструкции вида
extern int i;
extern float mas[];
декларируют, что объекты i (переменная) и mas (массив), имеющие тип int и float, не создаются, а память им выделяется при их объявлении в другой функции.
Для всего множества функций, образующих программу, должно быть не более одного определения каждой из внешних переменных. В объявлении массивов необходимо указывать их размерность, однако при декларировании массива с extern это не требуется.