- •Данные Скалярные данные Целые данные: char, short, int, long.
- •Указатели
- •If( целое_выражение )
- •Оператор продолжения цикла
- •Функции
- •Указатели ,строки
- •Структуры, списки.
- •Переименование типов
- •Списки.
- •Работа с файлами
- •6.2 Описание и передача параметров
- •6.4 Указатель на функции
- •7.0 Переименование типов. Классы памяти. Область видимости
- •7.1 Переименование типов
- •7.2 Классы памяти:
Структуры, списки.
Структура позволяет объединять данные разных типов и объединение под первым названием. В качестве полей могут быть любые типы. Для доступа:
Имя переменной структурного типа. Имя поля.
PS поле = (*PS ). поле
Р - указатель на структуру
Переименование типов
typedef -даем новое имя уже существуюющему типу
typedef int INTEGER;
INTEGER - тоже что и int
typedef struct {описание полей} MyStruct
MyStruct а;
Struct {описание полей}
Списки.
Структура данных, в которых есть элементы и для связи между ними используются поля связи, в которых стоят адреса или ссылки на другие элементы
гол 0
адрес след
Struct EL ist {
Struct EList * Prev
Struct EList * NEXT
Char Дата
}; * prev
typedef struct EList EList
Struct List {
EList * Head;
EList * Tail
}
typedef Struct List List
Для первого элемента списка поле prev содержит NULL, для последнего поле Next =NULL.
Пустой список: переменная типа List в полях Head и Tail = 0
ПРИМЕР:
Функция, которая вставляет новый элемент в список после указанного элемента в этом списке.
Входные параметры:
список, в который вставлять List L;
элемент, после которого вставлять Е типа Еlist
инф. часть элемента, который будет вставлять charД.
Выходные параметры:
L - модифицировать
L и выходной параметр
Может быть указатель на новый элемент и признак ошибки либи удача OK(очень хорошо).
Структуры тоже можно представить по значению.
По ссылке:
Elist * Elist Ins (List L
Elist * E
char Д)
Если *Е = NULL => вставляем на первый элемент.
нормальный
последний
вставить как самый первый
в пустой список
Возможные ошибки: нехватка памяти;
функция возвращает NULL
если OX , то возвращает функцию.
Возможные гадости: вместо Д - пакость .Проверить можно, но дорого
не пустой список , E = NULL
или голова или хвост - NULL.
Тип программы:
Elist * t;
if (!(t = (Elist * ) malloc(sizeof (Elist))))) четные (NULL);
Функция malloc возвращает указатель не типизированный.
Операция преобр. типа: (тип) выражение.
если NULL, то ! NULL = 1 if - истино и return(NULL)
if(E) {
t -> Next = E -> Next;
E -> Next = t; если в середину
}
else {
t -> Next = L -> Head;
L -> Head = t; если самый первый
}
t -> prev = E; замыкает ссылку на элемент
if (t-> Next) (t -> Next)-> Prev = t; проверка,если
else L -> Tail = t; в конец списка.
t-> Data = D;
return (t);
} / * Ins EList * /
free (char) - освобождение памяти.
Работа с файлами
P > f . a - стандартный вывод в указанный файл.
P < f . a - ввод из файла f . a
#define EOF(-1) - при считывании с помощью стандартного вводо вывода проверка на конец
файла.
int getchar (void); - чтение символа из стандартного ввода , возвращает значение типа int.
while (( c = getchar( )) ! = EOF) {.......}
int putchar (char) - служит для вывода символа на ст. вывод
printf (char * format, аргумента ); - форматные преобразования и вывод
% -на экран, если управляющий символ
% [ширина] d - аргумент - целое число в десятичной форме . Выдать на ст. вывод.
% u - беззнаковое целое, десятичное.
o - беззнаковое целое , восьмеричное.
x - беззнаковое целое, шестнадцатиричное.
c - символ
s - строка или массив символов с % 0 в коце int scanf (char * format , аргумент) - считывает из входного потока данные.
Несоответствие format оначает конец ввода.
аргумент = & i - адрес.
char * gets(char *); - читает до конца строки.
int puts(char *) - вывод строки.
FILE - тип файла
Описание указателя на структуру файла.
FILE * f;
FILE * fopen (char * name, char * mode)
r - read - чтение функция открытия файла
w - write - запись если нельзя его открыть , то возвращ. 0
a - append - дописывать
b - бинарный
if (!( f = fopen (.....))) return (ошибка);
fclose (FILE *); - закрытие файла и освобождение
int fputc ( char , FILE *);
fprintf ( FILE * )
fscanf (FILE , )
СТРУКТУРНЫЙ ПОДХОД К СИ
Лексика языка
1.1 Алфавит языка
1.2 Комментарии
1.3 Идетефикаторы и разделители
1.4 Зарезервированные слова: (зарезервированные слова в качестве имен, переменных использовать нельзя)
1.5 Константы
Сколярные типы данных и операций.
2.1 Поняти леводопустимого выражения
( Loalue - выражение ,которое может стать в левой части присваивания) для имен массивов это не допустимо, а также *( p1 - p2 ) , f(.......) = - вызов функции.
2.2 Целые
2.3 Вещественные
2.4 Перечислимые
2.5 Прочие операции:
“, ” Н/ пр выр1, выр2, выр3 результат = выр3.
условная операция:
выр1 ? выр2 : выр3.
2.6 Преобразования типов.
Преобразование типа:
(тип) выражение
sizeof (тип) - размер типа
sizeof (имя переменной) - размер соответствуюющей переменной
char m[200] , *
sizeof (m) -> 200 размер массива
sizeof (pm) -> размер указателя соответствующего типа.
a + + , + + a , a - - , - - a.
a + + , ~ a : = a + 1 ; a - - , ~ a : = a - 1.
a = 5;
b = a + + ; -> b = 5
b = + + a ; -> b = 6
a + = 5 ; ~ a = a + 5
a * = 7 ; ~ a = a * 7
Преобразование типов : Операция явного преобразования типов
(тип) выражение.
(тип) - результирующий тип
Приоритетность типов :
enum, char, chort -> int -> long -> double
chort double
insigned <- signed
Если выражения встречаются знаковые , то они ->
flort -> double (всегда перед выполнением).
Указатель на тип Т = массив типа Т
char * pc , mc [200]
pc = mc (присвоение адреса самого первого эламента массива). ~ pc = & mc [0].
Указатель типа Т1 = указатель типа Т2 (это допустимо)
Указатель на функцию = имя функции;
2.7 ПОРЯДОК ВЫПОЛНЕНИЯ ОПЕРАЦИЙ:
Для операций && , // , ?: , - гарантируется порядок вычисления операндов слева на право для остальных порядок не гарантируется f (....) + g(....)
(b1 + b2 ) + b3 - скобки игнорируются
b1 && b2 b1 - сначало b2 - потом
В языке СИ используется сокращенное вычисление выражений
b1 && b2 - если b1 = 0, то b2 - не вычисл.
b1 // b2 - если b1 = 1, то b2 - не вычисл.
2.8 ПРИОРИТЕТЫ
Обратить внимание на левостороннии и правостороннии операции
+ + + - левосторонняя операция
. -> - правосторонняя операция
3.0 ОПЕРАТОРЫ. УПРАВЛЕНИЕ СТРУКТУЫ
4.0 УКАЗАТЕЛИ И МАССИВЫ
4.1 Операции * и амперсант (&)
Примеры :
char *p; указатель на char
char **p; указатель на указатель на char
char *f( ); функция возвращяющая указатель начала
char (*f( )) ( ); указатель на функцию которая возвращает char
char cm [5] массив char
char *pcm [5] массив указателей на char
char (*cpm) [5] ; указатель на массив из 5 char
char *p; указатель на символ
cpm + + на 5 байт
p + + на 1 байт
4.2 Арифметика указателей
pe ie pe - выражение типа указатель
pe1 pe2 ie - целое выражение
Выражается в размерах объекта.
pe1 отношение pe2
<
>
== не гарантируется для указателей правильность
!=
Во всех реализациях гарантируется правильность операций сравнения.
5.0 СТРУКТУРЫ. ОБЪЕДИНЕНИЯ . ЗАПИСЬ.
5.1 Структуры:
Описание определение переменных
Инициализация
структ. тип S={ значение поля 1, …} ;
Доступ к полям
Для переменных структурного типа разрешена операция присваивания, которая понимается как побитовае копирование структуры
5.2 Объединение.
Описание
имя -объед {
тип1 , поле1 ;
………………
} ;
Определение переменных и определение типа стр.
Для полей выделяется одна и таже область памяти и длина ее равна max длины поля.
5.3 Записи: (битовые поля)
Основная цель - упоковать в запись несколько типов полей
Описание:
struct имя - записи {
int поле1 :цел1;
int поле2 : цел2; - количество битов,котор. занимает каждое из полей
};
Доступ к полям записей
r. поле1
6.0 Функции
6.1 Определение и обращение к функции прототипу
[тип возвращ. значения] имя функции ([список параметров])
если опущен => INT
{
тело
}
Обращение к функции:
имя функции ([список фактических параметров])
Прртотип функции: Определение функции должно предшествовать ее использованию.
Описание прототипа:
[extern] [тип возвращ. значения ] имя функции ([……]);
имя функции это внешее (глобальное) имя.
В языке СИ функции рекурсивны.