Типы данных
В предыдущих лекциях изучили новые типы данных языка Си:
Указатели |
char* p, int* p, float* p, и т.п. |
Структуры и объединения |
struct name {…}, struct* name {…}, return() и т.п. |
Указатель – это номер ячейки памяти, где хранится переменная описываемого типа.
Структура – это список элементов, упорядоченно располагаемых в памяти компьютера и функционально принадлежащих одной смысловой группе переменных.
struct man // Имя структуры
{
char name[20]; //
int dd,mm,yy; // Элементы структуры
char *address; //
} A, B, X[10]; // Определение
// структурированных
// переменных
Определение структуры как таковой и определение структурированных переменных – могут быть выполнены раздельно:
struct man // Определение структуры
{
char name[20];
int dd,mm,yy;
char *address;
}
struct man A, B; // Определение
struct man X[10];// структурированных
// переменных
Имя структуры struct man используется также для обозначения того, что формальный параметр или результат функции представляют собой указатель на структурированную переменную:
struct man *create();
int print(struct man *p)
Т.о., можно сделать вывод о том, что в языке Си существуют два типа данных:
базового: char x; int y; float z;
и
производного: char* x; int* y; float* z; struct name, массивы; функции;
типов.
Ключевым понятием в дальнейшем изложении является понятие типа данных. В программировании оно является довольно сложным, поэтому остановимся на его "образном" определении.
Тип данных – заложенная в транслятор “идея” переменных определенного вида, форма представления данных
Т.о., тип данных – это “идеальное” представление переменной, которое транслятор содержит в себе и при помощи которого он может порождать в программе переменные соответствующего типа.
Рассмотрим подробнее, что входит в определение типа данных.
Если программе известен тип данных, то ей известны и его характеристики:
- способ представления в памяти (способ построения из известных типов);
- возможные операции (действия);
- множество возможные значения;
- размерность памяти, необходимой для создания переменной (sizeof).
Для чего нам ВСЁ ЭТО необходимо знать?
Во-первых – для глубинного понимания языка программирования (теоретический аспект).
Во-вторых – для грамотного планирования количества и типа данных при создании Ваших программ (в практическом применении), например для задач оптимизации кода.
Способ представления ТИПОВ ДАННЫХ в памяти (это очень важно)
Способ представления однозначно определяет как возможные значения, которые принимает тип данных, так и размерность памяти, которая требуется для создания переменных этого типа.
Простой
Беззнаковые целые: unsigned. Только сектор в памяти для размещения размерности переменной.
Целые со знаком: char, int, long. Два сектора – для размещения размерности переменной и однобайтовый сектор для отрицательного представления.
С плавающей точкой: float, double. Три сектора – для размерности переменной, для отрицательного знака и представления разделителя целой и дробной частей.
Кроме того, для данных с повышенной точностью представления резервируется комплексный сектор для представления порядка числа:
идентификатор_степени.знаковый_байт.степень
Производный
Определяется способом построения типа данных из составляющих его уже известных типов (например, структура).
Любой тип данных в Си предполагает фиксированную размерность памяти создаваемых переменных. Эта размерность, выраженная в байтах, возвращается операцией sizeof.
Тип данных это не просто их описание, но и набор возможных действий (в языке Си -операций) над переменными этого типа.
Это означает, что программист "знает", а транслятор "умеет выполнять" определенные в типе данных операции над любой переменной этого типа в программе.
Для каждого типа существует свой набор действий. Он может быть однотипен по сути, но резко различаться по результату.
Например:
операция сложения (простейшая)
числа (int, double …) |
символы (char) |
указатели ( * ) |
увеличение величины |
смена символа |
смена ячейки памяти |
11 –> 12 65 – > 66 (A –> B) 1100 –> 1104
От типа данных к переменной
От теории к практике
Тип данных – это "идея" переменной, сама переменная представляет собой "воплощение" этой идеи в памяти программы.
Процесс “воплощения” заключается в выделении (распределении) памяти для размещения переменной.
Выделенный сегмент далее всегда ассоциируется с именем переменной
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.