
- •Требования к оформлению графика
- •Требования к тексту программы
- •Содержание отчета
- •Варианты заданий
- •Алфавит
- •Объявление переменных. Типы данных
- •Простые типы данных
- •Структурированные типы данных
- •Константы
- •Операции Присваивание.
- •Арифметические:
- •Логические (результат – логическое значение).
- •Функции
- •Директивы препроцессора
- •Указатели
- •Приведение типов
- •Типизированные и нетипизированные указатели
- •Массивы
- •Функции работы с памятью
- •Строки.
- •Указатель на функции
- •Работа с файлами.
- •Форматированный ввод-вывод
Указатели
Переменные хранят данные и не позволяют их управлять размещением в памяти. Единственная доступная операция – взятие адреса (&).
Указатель на переменную хранит адрес размещения данного. Обратиться к данному можно через операцию разыменовывания указателя (*). Объявление указателя осуществляется символом «*» перед именем переменной. Пример:
int x;
int *t; // объявили указатель t на переменную типа int
t = &x; // присваиваем указателю адрес переменной x
*t = 4; // используя указатель, присваиваем x значение 4
Указатели и объекты одного типа могут быть объявлены вместе. Пример (см. предыдущий пример):
int x,*t=&x;
Приведение типов
В языке «C» простые типы данных автоматически приводятся к требуемому. Вещественные преобразуются к целым путём отсечения дробной части. Данные большего размера приводятся к данным меньшего размера отбрасыванием старших байт. Для более сложных типов данных, а также для указателей требуется явное преобразование типов. Операция преобразования типа имеет вид:
(новый_тип)переменная
При этом для объектов (экземпляров классов и структур) операция приведения должна быть определена. Для указателей допустимо приведение к другому указателю. Приведение указателей никак не преобразует сами данные.
Примеры приведены далее.
Типизированные и нетипизированные указатели
Рассмотренные указатели являются типизированными, т.е. могут указывать только на заданный тип данных.
Существуют также нетипизированные указатели (void*), способные указывать на любой тип данных. Сохранение размера и типа данного возложено на программиста.
Пример:
int x;
float y;
void *t = &x; //допустимо
*t
= 5; // операция НЕДОПУСТИМА,
т.к. неизвестен тип данного
*(int *)t = 5; //допустимо обращение при соответствующем приведении типов
t =& y;
*(double*)t = 2.5;
Для типизированных указателей определены операции сложения с числом и вычитания из них числа, при этом результатом является указатель того же типа, смещенный в памяти на заданное количество данных (т.е. на размер данного, умноженного на заданное смещение).
Также для типизированных указателей определена операция разности указателей. Данная операция возвращает количество элементов (размер_области_памяти/размер_элемента) между указателями.
Массивы
Массивы являются набором однотипных данных, последовательно размещённых в памяти.
Одномерный массив можно объявить так:
тип_данного имя_массива[размер];
Например: int x[5];
Обращение к элементам массива происходит через операцию []. Минимальный индекс всегда ноль. Максимальный индекс – на единицу меньше размера массива.
ВНИМАНИЕ Автоматический контроль границ отсутствует.
Имя массива является указателем на начало массива. Операция x[i] тождественно равна *(x+i).
Возможно использование многомерных массивов.
int x[4][4][3];
x[0][0][0] = 5;
Массивы могут инициализироваться значениями в фигурных скобках, при этом допустимо не указывать последнюю (самую левую) размерность. Если заданная размерность меньше инициализирующих аргументов, часть элементов останется неопределенна. Обратная ситуация вызовет ошибку.
Примеры:
int x[3][2]={{1,2},{3,4},{5,6}}; //заданы и размеры массива, и инициализирующие значения
long y[] = {1,2,3,4}; // размер массива определяется фактическому по количеству значений (4)
char t[][4] = {{1,2,3,4},{5,6}}; // последняя размерность определяется по числу значений (2) и // элементы t[1][2] и t[1][3] не определены