- •Краткая характеристика1
- •Алфавит
- •Объявление переменных. Типы данных
- •Простые типы данных
- •Структурированные типы данных
- •Константы
- •Операции Присваивание.
- •Арифметические:
- •Логические (результат – логическое значение).
- •Операции работы с указателями.
- •Функции
- •Директивы препроцессора
- •Указатели Обзор
- •Приведение типов
- •Типизированные и нетипизированные указатели
- •Операции над указателями
- •Массивы
- •Многомерные массивы
- •Указатели в качестве параметров функций
- •Функции работы с указателями и памятью
- •Строки.
- •Время жизни и область видимости переменных
- •Указатель на функции
- •Работа с файлами.
- •Форматированный ввод-вывод
- •Введение в объектно-ориентированное программирование
- •Часть 2. Введение в технологию программирования.
- •Этапы развития программирования.
- •Проблемы разработки сложных программных систем:
- •Жизненный цикл программного продукта.
- •Модели жц.
- •Экстремальное программирование
- •Оценка качества процессов создания программного обеспечения.
- •Процессы проектирования.
- •Требования, цели
- •Внешнее проектирование.
- •Диаграммы потоков данных (Data Flow Diagrams).
- •Внешнее проектирование модулей
- •Модульная декомпозиция
- •Почему модуль должен компилироваться с первого раза?
- •Рекомендации по внесению ясности в текст программы:
- •Тестирование.
- •Документирование.
- •Пользовательский интерфейс
- •Часть 3. Типовые структуры данных и алгоритмы.
- •3.1 Структуры данных Логические структуры данных:
- •Хранение циклических структур данных в памяти компьютера
- •Организация двусвязанного списка.
- •Организация массива переменного размера:
- •3.2 Алгоритмы Быстрая сортировка
- •Поиск пути
- •Примеры программ
- •Список литературы
Указатели Обзор
Переменные хранят данные и не позволяют управлять их размещением в памяти. Единственная доступная операция – взятие адреса (&).
Указатель на переменную хранит адрес размещения данного. Обратиться к данному можно через операцию разыменовывания указателя (*). Объявление указателя осуществляется символом «*» перед именем переменной. Пример:
int x;
int *t; // объявили указатель t на переменную типа int
t = &x; // присваиваем указателю адрес переменной x
*t = 4; // используя указатель, присваиваем x значение 4
Указатели и объекты одного типа могут быть объявлены вместе. Пример (другая раелизация предыдущего примера):
int x,*t=&x;
Константа NULL предназначена для обозначения неинициализированных указателей.
Приведение типов
В языке «C» простые типы данных автоматически приводятся к требуемому. Вещественные преобразуются к целым путём отсечения дробной части. Данные большего размера приводятся к данным меньшего размера отбрасыванием старших байт. Для более сложных типов данных, а также для указателей требуется явное преобразование типов. Операция преобразования типа имеет вид:
(новый_тип)переменная
При этом для объектов (экземпляров классов и структур) операция приведения должна быть определена. Для указателей допустимо приведение к другому указателю. Приведение указателей никак не преобразует сами данные.
Примеры приведены далее.
Типизированные и нетипизированные указатели
Рассмотренные указатели являются типизированными, т.е. могут указывать только на заданный тип данных.
Существуют также нетипизированные указатели (void*), способные указывать на любой тип данных. Сохранение размера и типа данного возложено на программиста.
Пример:
int x;
float y;
void *t = &x; //допустимо
*t
= 5;
// операция НЕДОПУСТИМА, т.к.
неизвестен тип данного
*(int *)t = 5; //допустимо обращение при соответствующем приведении типов
t =& y;
*(double*)t = 2.5;
Операции над указателями
Для типизированных указателей определены операции сложения с числом и вычитания из них числа, при этом результатом является указатель того же типа, смещенный в памяти на заданное количество данных (т.е. на размер данного, умноженного на заданное смещение).
Также для типизированных указателей определена операция разности указателей. Данная операция возвращает количество элементов (размер_области_памяти/размер_элемента) между указателями.
Пример (будем считать, что sizeof(float)=4):
float *a=1000, *c;
short x;
c = a+10; // c = 1000+10*sizeof(float)=1040
c = c – 4; // c = 1040 – 4*sizeof(float) = 1024
x = c – a; // x = (1024-1000)/sizeof(float) = 6
Массивы
Массивы являются набором однотипных данных, последовательно размещённых в памяти.
Одномерный массив можно объявить так:
тип_данного имя_массива[размер];
Например: int x[5];
Обращение к элементам массива происходит через операцию []. Минимальный индекс всегда ноль. Максимальный индекс – на единицу меньше размера массива.
ВНИМАНИЕ Автоматический контроль границ отсутствует.
Возможно создать массив требуемого размера во время выполнения программы. Например, в библиотеке mem.h определены функции malloc для выделения памяти и free для её освобождения.
Пример:
int *x;
x = (int*)malloc(10*sizeof(int)); // выделение памяти для 10 элементов типа «int»
… // некоторый код по работе с массивом
free(x); // освобождение памяти
Более подробно данные функции будут рассмотрены ниже.
В «С++» для выделения памяти под массив элементов определены операции new[] и delete[].
Пример (аналогичный по функциональности предыдущему):
int *x;
x = new int[10];
…
delete []x;