- •Введение
- •Тема 1.1.Лексические основы языка программирования Общие сведения о программах, лексемах и алфавите
- •Тема 1.2.Концепция типа данных Понятие переменной
- •Основные типы данных
- •Указатели
- •Перечисления (перечислимый тип)
- •Массивы
- •Тема 1.3.Основные управляющие структуры программирования Понятие алгоритма
- •Свойства алгоритма:
- •С помощью языка программирования. Управляющие структуры и основные конструкции языков программирования
- •Тема 1.4.Основы модульного программирования
- •Подпрограммы
- •Рекурсивные функции
- •Раздел 2.Технология создания программ Тема 2.1.Интегрированная среда программирования
- •Трансляторы
- •Тема 2.2.Жизненный цикл программного обеспечения (Этапы подготовки и решения задач на эвм)
- •Анализ требований (постановка задачи, обследование)
- •Определение спецификаций
- •Кодирование
- •Тестирование, отладка и оптимизация
- •Внедрение и сопровождение
- •Раздел 3.Основные парадигмы программирования Тема 3.1.Генезис языков программирования.
- •Основные вехи в истории развития языков программирования
- •Классификация языков программирования
- •Уровни языков программирования
- •Поколения языков программирования
- •Тема 3.2.Основные парадигмы (технологии) программирования
- •Структурное программирование
- •Функциональное программирование
- •Логическое программирование
- •Объектно-ориентированное программирование (ооп)
- •Основные свойства ооп
- •Структуры (записи)
- •Объединения (запись с вариантами)
- •Как массив символов
- •Как указатель на строковую константу
Указатели
Указатели – это переменные, значениями которых служат адреса участков памяти, выделенных для объектов конкретных типов. Различают три вида указателей – указатели на объекты, на функции и на void. Кроме того, различают указатели-переменные и указатели-константы. В простейшем случае определение указателя-переменной на некоторый объект имеет вид
тип *[const] имя [инициал_выр];
где звездочка относится непосредственно к имени. Например,
char *t1, *t2, t3; // t1, t2 -неинициализированные указатели на объекты типа char (то есть в переменных t1, t2 может храниться адрес объекта типа char), a t3 – переменная типа char;
const int *t1; указатель на константу целого типа.
В качестве инициализирующего выражения указателя должно использовать константное выражение, частными случаями которого являются
явно заданный адрес участка памяти, char *p1= (char *) 0xb8000000; // обратите внимание на необходимость преобразования числового значения к типу указателя (char *).
пустое значение (NULL), char *p2 =NULL; // нулевой указатель на объект типа char. Если значение константного выражения равно нулю, то это нулевое значение преобразуется к пустому (иначе нулевому, NULL) указателю. Нулевой указатель отличен от указателя на любой объект.
выражение, позволяющее получить адрес объекта с помощью операции ‘&’, char c = 'a'; char* const p3 = &c;//указатель в p хранится адрес c
указатель, уже имеющий значение, char *p4=p3; // в p4 также хранится адрес c.
Кроме того инициализировать указатель можно с помощью операции динамического выделения участка памяти new. Например,
char *p5= new char; //выделили память для перемененной типа char и связали указатель p с эти участком памяти.
Таким образ выделенная память должна быть освобождена с помощью операции delete. В противном случае одна будет занята до перезагрузки операционной системы (Это проблема называется проблемой «динамического мусора»). Например, delete p5;
Основная операция над указателем – разыменование, унарная операция ‘*’ (получение значения через указатель). Эта операция также называется косвенным обращением или обращением по адресу. Например,
char d=*p3;// значением переменной d будет значение того участка памяти, с которым связан указатель p3, то есть d=c= ‘a’.
С помощью операции разыменования инициализированного указателя можно не только получать, но и изменять содержимое участка памяти, с которым связан указатель. Например,
*p3= ‘b’; // значением переменной с стал символ ‘b’.
Разыменование нулевого указателя приводит к ошибки времени выполнения, так как данная область памяти недоступна. Разыменование неинициализированного указателя приведет либо к ошибке времени выполнения, либо к получению случайных данных из памяти. Поэтому рекомендуется всегда инициализировать указатель при описании, а перед разыменованием проверять его на NULL.
Над указателями-переменными можно также осуществлять операции присваивания, сложение с константой, вычитание, --, ++, сравнение, приведение типов.
Если указатель описан со спецификатором const (то есть является константой-указателем), то он должен быть инициирован и его значения нельзя будет изменить с помощью приведенных выше операций. Например,
char * const p6=p5;
Указатель на void применяется в тех случаях, когда конкретный тип объекта, адрес которого следует хранить, не определен. Таким указателям можно присвоить значение указателя любого типа, а также сравнивать его с любыми указателями.
Ссылки
Ссылка представляет собой синоним имени, уже существующего объекта, и поэтому не занимает место в памяти (в отличии от указателя). Формат описания:
тип & имя инициализатор;
Наличие инициализатора обязательно. После инициализации ссылке не может быть присвоено другое значение. Например,
int a=10;
int& a1=a;
cout<<a<<a1;
a1+=2;
cout<<a<<a1;
Значением ссылки является адрес объекта, на который указывает ссылка, и, по сути ссылка представляет указатель, который не надо разыменовывать. В основном ссылки используются при работе с функциями.