
- •Федеральное агентство по образованию
- •Краткая история языка с
- •Особенности и основные понятия языка Си
- •Структура программы
- •Типы данных
- •Классификация типов данных
- •Вещественные
- •Логический
- •Диапазоны представления данных
- •Объявление переменных
- •Константы в языке Си
- •Операции языка Си. Приоритет операций
- •Операция присваивания
- •Арифметические операции
- •Операции отношения
- •Логические операции
- •Поразрядные операции
- •Операцияsizeof
- •Операция выбора по условию
- •Операция запятая
- •Приведение типов Неявное преобразование типов
- •Явное преобразование типов
- •Основные средства ввода-вывода на Си Понятие потока
- •Стандартные потоки
- •Функции потокового ввода-вывода
- •Функции ввода
- •Ввод символов
- •Ввод строк
- •Форматированный ввод
- •Операторы языка Си
- •Оператор if
- •Оператор switch
- •Оператор while
- •Оператор do while
- •Оператор for
- •Оператор break
- •Оператор continue
- •Функции вывода на экран
- •Вывод символов
- •Функция вывода строк puts()
- •Форматированный вывод
- •Указатели в языке Си
- •Адресная арифметика
- •Массивы
- •Функции в языке с
- •Прототипы функций
- •Указатели типа void
- •Функции, возвращающие указатели
- •Встраиваемые функции
- •Рекурсивные функции
- •Функции с переменным числом аргументов
- •Аргументы функции main()
- •Область действия и область видимости
- •Локальные переменные
- •Локальные переменные в функции Main()
- •Глобальные переменные
- •Классы памяти
- •Указатели на указатели
- •Указатели и многомерные массивы
- •Массивы указателей
- •Указатели на функции
- •Операции над строками символов Определение длины строки
- •Копирование строк
- •Поиск в строках
- •Преобразования символов в строках
- •Другие функции для работы со строками
- •Преобразования строк в числа
- •Преобразования чисел в строки
- •Функции анализа символов
- •Распределение памяти
- •Манипулирование блоками памяти
- •Типы, определяемые пользователем
- •Перечислимый тип
- •Структуры
- •Сложные структуры
- •Битовые поля в структурах
- •Объединения
- •Работа с файлами Связь между потоками и файлами
- •Типы дисковых файлов
- •Открытие файла
- •Запись и чтение данных
- •Форматированный ввод-вывод Форматированный вывод
- •Int fprintf (file *fp, char *fmt, ...);
- •Форматированный ввод
- •Символьный ввод
- •Символьный вывод
- •Блочный ввод-вывод
- •Закрытие файла
- •Директивы препроцессора
- •Директива #include
- •Директива #define
- •Директивы условной компиляции
- •Директива #undef
- •Предопределенные макросы
- •69 Лекции по курсу «Языки программирования» Часть III
Структуры
Структура — это совокупность нескольких переменных под единым именем, рассматриваемых как одно целое. В отличие от массива, переменные в структуре могут иметь различные типы. Переменные внутри структуры называются ее членами или полями. Структуры могут содержать данные любых типов Си, в том числе массивы и другие структуры.
Объявление и определение структур
Синтаксис:
struct имя_структуры{
элемент(ы)_структуры;
} имя_переменной;
struct – ключевого слова, которое определяет структуру;
имя_ структуры - имя создаваемого структурного типа;
имя_переменной – переменная данного структурного типа.
Если структура определяется без объявления переменных, то такое определение является всего лишь шаблоном, который можно использовать позже в программе для объявления структурных переменных. Такой шаблон имеет следующий формат:
struct имя_структуры { /*определен шаблон структуры */
элемент(ы)_структуры; /* и определен новый тип – struct имя_структуры*/
};
Объявление переменных с использованием этого шаблона структуры имеет следующий вид:
struct имя_структуры имя_переменной;
Это объявление будет синтаксически правильным только в том случае, если ранее была определена структура с заданным именем_ структуры.
С помощью ключевого слова typedef создается синоним структурного типа:
typedef struct {
элемент(ы)_структуры;
} имя_типа_структуры;
----------------------------
|
синоним
Далее определяем переменную данного типа:
имя_типа_структуры имя_переменной ;
Обратите внимание, что созданный таким образом тип отличается от имени_шаблона структуры.
Выбор между typedef и именем_шаблона структуры является делом вкуса. Большой практической разницы тут нет. Определение типа через typedef несколько короче, потому что не надо писать ключевого слова struct. С другой стороны, использование этого слова и имя_шаблона структурного типа ясно показывает, что объявляется именно структура, и это удобно для программиста при чтении кода.
Примеры
На Паскале: |
На Си: | |
a : record b : char; c : integer; end; |
имя структуры | ----- struct bc { char b; int c; } a ; --- | имя переменной |
имя структуры | ----- struct bc { char b; int c; };
struct bc a; |
Type t = record b : integer; c : char; end; Var a : t; |
|
typedef struct { int b; char c; } t;
t a; |
Инициализация и обращение к полям структуры
Отдельные элементы структуры могут использоваться точно так же, как простые переменные тех же типов. Чтобы извлечь их значения из структуры, применяется знак операции обращения к элементу структуры (.), представляющий собой точку между именем структуры и именем элемента-поля. И в языке Си нет даже близкого аналога Паскалевского оператора with do;.
Пример
struct bc { char b; int c; } a1 = {30, ‘B’}, a2;
|
struct bc { char b; int c; };
struct bc a1 = {30, ‘B’}, a2; |
typedef struct { int b; char c; } t; t a1 = {30, ‘B’}, a2; |
a1.b = 10; a2.b = 20;
a1.c = ‘A’; a2.c = ‘Z’;
Структуры можно присваивать: a1 = a2;, что эквивалентно a1.b = a2.b; a1.c = a2.c;
Присваивание возможно только в том случае, если переменные а1 и а2 объявлены одним шаблоном. Если шаблоны имеют разные имена, но одинаковое описание, то такое присваивание невозможно.