- •Введение
- •Достоинства и недостатки языка c
- •Типы данных в с
- •Модификаторы
- •Константы
- •Арифметические операции
- •Логические операции
- •Оператор присваивания
- •Организация множественных выражений
- •Комбинированные операции
- •Локальные и глобальные объекты
- •Модификатор extern
- •Статические и динамические объекты
- •Регистровые переменные
- •Описание неизменяемых объектов
- •Указатели
- •Явное преобразование типа
- •Оператор if
- •Операторы циклов Оператор while
- •Оператор do ... While
- •Оператор for
- •Оператор switch (переключатель)
- •Операторы передачи управления
- •Прототипы функций
- •Передача данных в функцию
- •Структуры и определения типов пользователя
- •Битовые поля
- •Объединения
- •Псевдофункция sizeof
- •Основные директивы препроцессора
- •Основные директивы условной компиляции
- •Дополнительные данные по Turbo-c
- •Организация памяти на машинах класса pc. Виды указателей
- •Работа с указателями на функцию
- •Основные регистры общего назначения процессора
- •Модели памяти
- •Использование стека
- •Организация прерываний в программе. Модификатор volatile
- •Порядок передачи данных в функцию. Модификатор pascal
- •Передача данных в программу. Функция main
- •Разбор типовых ошибок и недочетов при программировании
- •Некоторые функции библиотеки Turbo-c
- •Функции работы с оперативной памятью эвм
- •Функции работы с клавиатурой
- •Работа с дисплеем в символьном режиме
- •Работа с дисплеем в графическом режиме
- •Функции работы с дисками
- •Функции работы с временными интервалами и звуком
- •Функции преобразования данных
- •Функции работы со строками
- •Математические функции
- •Функции работы с файлами и каталогами
- •Функции работы со временем и датой
- •Функции процессов
- •Функции работы с портами машины
- •Интерфейс с дос
- •Задачи на практические занятия
- •Литература
- •Оглавление
Битовые поля
При описании структур могут быть использованы битовые поля. Например,
struct fr
{
int i:2;
int j:2;
unsigned k:2;
int :4;
int l:6;
} a,b,c;
обеспечивает следующее размещение (побитно):
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
l |
не используется |
k |
j |
i |
Если приглядеться к описанию элементов этой структуры с именем fr, то видно, что характерной их особенностью является то, что все они имеют целый тип (длина 2 байта или 16 бит). Сумма чисел после двоеточия соответственно 16 (это биты, младший из которых имеет номер 0).
Объединения
В С можно размещать различные компоненты в одной области памяти, чем достигается доступ к различным частям компонент.
Общая форма описания:
union <тег или список>
{
элементы
. . .
}
<список символических имен>;
Пример: получение доступа к младшему и старшему байту целой переменной типа unsigned
a.
union
{
unsigned int a;
unsigned char b[2];
} c;
. . .
c.a=30000;
. . .
/* c.b[0] - младший байт
c.b[1] - старший байт */
При описании объединений можно создать тип объединения с использованием описания типа typedef.
б.
typedef union
{
unsigned int a;
unsigned char b[2];
} f;
f c;
. . .
c.a=30000;
. . .
/* c.b[0] - младший байт
c.b[1] - старший байт */
В качестве компонент объединения можно использовать любой тип, включая структуры.
в.
typedef union
{
unsigned int a;
struct {
unsigned char l;
unsigned char r;
} b;
} f;
f c;
. . .
c.a=30000;
. . .
/* c.b.l - младший байт
c.b.r - старший байт */
Псевдофункция sizeof
Эта псевдофункция вызывается следующим образом:
sizeof(имя объекта или типа)
Возвращается значение длины объекта или типа в байтах. Это значение не вычисляется в ходе выполнения программы, а организуется путем макроподстановки и имеет конкретное значение в момент начала выполнения задачи.
Примеры:
1.
sizeof(double) вернет значение 8.
2.
int a[3];
. . .
sizeof(a) вернет значение 6 (3*2).
Основные директивы препроцессора
При обработке файла с текстом программы транслятор с С может использовать препроцессор. Так называется программа, которая занимается предварительной обработкой текста в соответствии с директивами препроцессора. Она включается между компилятором и источником текста программы.
Основные директивы препроцессора:
1.
#define <что менять> <на что менять>
При этом в тексте программы будет произведена замена символов <что менять> на символы <на что менять>.
Примеры:
а.
#define PI 3.14159265
Теперь, если мы пишем в программе PI, то это эквивалентно, что если бы мы писали 3.14159265
б.
#define begin {
#define end }
В этом случае вместо { можно писать begin, а вместо } end.
2.
#undef <что менять>
Эта директива снимает назначение, установленное директивой #define.
3.
#include "<имя файла>"
В этом случае будет в текст программы вставлены операторы из указанного файла.
Пример:
#include "prog1.c"
/* при обработке препроцессором вместо этой строки будет
идти текст программы из файла prog1.c */
main()
{
. . .
Если же написано
#include <stdio.h>
то это означает, что файл с именем stdio.h надо искать не в текущем разделе, а в пути, указанном оболочке Turbo-C.