
- •1.Скалярные типы данных
- •Unsigned int 2/4 байта
- •2.Векторные типы данных
- •3. Неявное и явное преобразование типов.
- •Преобразования при вычислении выражений
- •4. Понятие истины и логические операции. Сравните с Паскалем, приведите примеры.
- •5. Типы циклов Оператор for
- •Оператор do while
- •6. Операторы ветвления
- •7. Указатели и операции над указателями
- •8. Массивы и указатели
- •9. Классы памяти
- •10. Структура и объединение. Доступ к полям. Сходства и отличия. Приведите примеры.
- •Объединения (смеси)
- •11. Объявление, прототип и определение функций. Приведите примеры.
- •12. Список формальных и фактических параметров.
- •13. Механизмы передачи формальных параметров в функцию. Приведите примеры.
- •14. Возвращаемое значение функции
- •15 Препроцессор языка с. Как и когда происходит макроподстановка.
- •16 Статистические и динамические объекты. Динамический захват памяти. Локальный и глобальный heap.
- •17. Потоковый и префиксный доступ к файлам.
- •18 Основные понятия текстового и графического режимов.
- •19. Использоване модификаторов near, far, huge. Приведите примеры.(аЯиП)
1.Скалярные типы данных
Важное отличие языка СИ от других языков (PL1, FORTRAN, и др.) является отсутствие принципа умолчания, что приводит к необходимости объявления всех переменных используемых в программе явно вместе с указанием соответствующих им типов.
Целый тип данных (он же скалярный)
Для определения данных целого типа используются различные ключевые слова, которые определяют диапазон значений и размер области памяти, выделяемой под переменные
Char 1байт от –128 до 127;
Int 2/4 байт
Short 2байта от –32768 до 32767
Long 4байта от -2147483648 до 21474836647
Unsigned char 1байт от 0 до 255
Unsigned int 2/4 байта
Unsigned short 2байта от 0 до 65535
Unsigned long 4байта от 0 до 21294967295
signed и unsigned указывают, как интерпретируется нулевой бит объявляемой переменной, т.е., если указано ключевое слово unsigned, то нулевой бит интерпретируется как часть числа, в противном случае нулевой бит интерпретируется как знаковый. В том случае, если спецификатор типа состоит из ключевого типа signed или unsigned и далее следует идентификатор переменной, то она будет рассматриваться как переменная типа int. Например: unsigned int n; unsigned int b; int c; (подразумевается signed int c );
unsigned d; (подразумевается unsigned int d ); signed f; (подразумевается signed int f ). Отметим, что модификатор типа char используется для представления символа (из массива представление символов) или для объявления строковых литералов. Следует сделать следующее замечание: в языке СИ не определено представление в памяти и диапазон значений для идентификаторов с модификаторами типа int и unsigned int. Размер памяти для переменной с модификатором типа signed int определяется длиной машинного слова, которое имеет различный размер на разных машинах. Так, на 16-ти разрядных машинах размер слова равен 2-м байтам, на 32-х разрядных машинах соответственно 4-м байтам
2.Векторные типы данных
Указатель – переменная, хранящая адрес другой переменной. В том случае, если переменная объявлена как указатель, то она содержит адрес памяти, по которому может находится скалярная величина любого типа. При объявлении переменной типа указатель, необходимо определить тип объекта данных, адрес которых будет содержать переменная, и имя указателя с предшествующей звездочкой (или группой звездочек). Размер переменной объявленной как указатель, зависит от архитектуры компьютера и от используемой модели памяти, для которой будет компилироваться программа. Указатели на различные типы данных не обязательно должны иметь одинаковую длину.
Для модификации размера указателя можно использовать ключевые.
unsigned int * a; /* переменная а представляет собой указатель на тип unsigned int (целые числа без знака) */
double * x;/ переменная х указывает на тип данных с плавающей точкой удвоенной точности */
char * fuffer ;/объявляется указатель с именем fuffer который указывает на переменную типа char */
double nomer;
void *addres;
addres = & nomer;
(double *)addres ++;/* Переменная addres объявлена как указатель на объект любого типа. Поэтому ей можно присвоить адрес любого объекта (& - операция вычисления адреса).
Массивы. Массивы - это группа элементов одинакового типа (double, float, int и т.п.). Из объявления массива компилятор должен получить информацию о типе элементов массива и их количестве. В языке СИ определены только одномерные массивы, но поскольку элементом массива может быть массив, можно определить и многомерные массивы. Они формализуются списком константных выражений, следующих за идентификатором массива, причем каждое константное выражение заключается в свои квадратные скобки. Каждое константное выражение в квадратных скобках определяет число элементов по данному измерению массива. В языке СИ первый элемент массива имеет индекс равный 0.
Примеры:
int a[2][3]; /представлено в виде матрицы
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]/
double b[10]; /* вектор из 10 элементов имеющих тип double */
Пример объявления символьного массива.
char str[] = "объявление символьного массива";
Следует учитывать, что в символьном литерале находится на один элемент больше, так как последний из элементов является управляющей последовательностью '\0'.
Структура языка Си это векторный тип данных для хранения элементов, преимущественно разного типа.
Использование структур приводит к необоснованным затратам памяти, следовательно использовать реже.
Объединение – это структура данных, когда определяется самое длинное поле и все остальные поля разделяют с ней один и тот же адрес, т.е. это средство, позволяющее запоминать данные различных типов в одном и том же месте памяти. Объединение позволяет создавать массив, состоящий из эл-тов одинакового размера, каждый из которых может содержать различные типы данных.
Объединения устанавливаются таким же способом, как и структуры. Есть шаблон и переменные объединения. Они могут определяться одновременно или, если используется имя объединения, последовательно за два шага:
Перечисляемый тип – множество поименованных целых констант.