- •Часть 1. Структурное программирование
 - •Екатеринбург
 - •Введение
 - •Состав языка Алфавит языка
 - •Идентификаторы
 - •Зарезервированные (ключевые) слова
 - •Знаки операций
 - •Константы
 - •Комментарии
 - •Типы данных
 - •Основные типы данных
 - •Структура программы
 - •Переменные и выражения Переменные
 - •Операции
 - •Примеры операций
 - •Выражения
 - •Функции ввода-вывода Основные функции ввода-вывода в стиле с
 - •Спецификации формата
 - •Модификаторы формата
 - •Операторы Оператор "выражение"
 - •Условный оператор if
 - •Оператор switch
 - •Цикл с предусловием
 - •Цикл с постусловием
 - •Цикл с параметром for
 - •Операторы передачи управления Оператор безусловного перехода
 - •Инициализация указателей
 - •Операции с указателями
 - •Массивы Одномерные массивы
 - •Динамические массивы
 - •Многомерные массивы
 - •Задание Написать программу, вычисляющую среднее арифметическое для каждого столбца и каждой строки двумерного числового массива a[4, 5]. Строки
 - •Типы данных, определенные пользователем
 - •Переименование типов
 - •Перечисления
 - •Структуры
 - •БиблиогрАфичеСкий список
 - •ОглавлеНие
 - •Часть 1. Структурное программирование
 - •620002, Екатеринбург, ул.Мира, 19
 - •620002, Екатеринбург, ул.Мира, 19
 
Инициализация указателей
Указатели используют при работе с динамической памятью. Динамическая память − это свободная память, в которой можно выделять место во время выполнения программы. Доступ к выделенным участкам динамической памяти, называемым динамическими переменными, производится только через указатели. Время жизни динамических переменных − от точки создания до конца программы или до явного освобождения памяти.
При определении указателя надо стремиться выполнить его инициализацию, т.е. присвоение начального значения.
Существуют следующие способы инициализации указателей:
1. Присваивание указателю адреса существующего объекта:
int a = 5;
int *p = &a;
int *p1(&a); // то же, что и предыдущая запись
int *r = p;
2. Присваивание указателю адреса области памяти в явном виде:
char *vp = (char*)0xD8000000;
здесь 0xD8000000 − шестнадцатеричная константа; (char*) − операция приведения типа: константа преобразуется к типу "указатель на тип char".
3. Присваивание пустого значения:
int *s = 0;
int *p = NULL;
здесь NULL − это константа-указатель, равный 0.
4. Выделение участка динамической памяти и присваивание ее адреса указателю:
int *n = new int;
int *m = new int (10); // используется операция выделения памяти
int *u = (int*) malloc (sizeof (int)); // используется функция из библиотеки С
Освобождение памяти, выделенной с помощью операции new, должно осуществляться с помощью операции delete, а памяти, выделенной функцией malloc, − с помощью функции free. При этом переменная-указатель сохраняется и может повторно быть инициализирована.
Примеры
delete n;
delete m;
free (u);
Операции с указателями
С указателями могут выполняться следующие операции: разадресация, или косвенное обращение к объекту ( * ), присваивание, сложение с константой, вычитание, инкремент (++), декремент (--), сравнение, приведение типов. При работе с указателями часто используется операция получения адреса (&).
Операция разадресации, или разыменования, предназначена для доступа к величине, адрес которой хранится в указателе:
char a;
char *p = new char;
*p = 'A'; a = *p;
unsigned long int A = 147483647;
unsigned short int *pi = (unsigned short int*)&A;
В последней строке происходит явное приведение типов.
Арифметические операции с указателями (сложение с константой, вычитание, инкремент и декремент) применимы только к указателям одного типа и имеют смысл в основном при работе со структурами данных, последовательно размещенных в памяти, например с массивами.
Ссылки
Ссылка представляет собой синоним имени, указанного при инициализации ссылки. Ссылки можно рассматривать как указатель, который всегда разыменовывается. Формат объявления ссылки:
тип & имя;
где тип − это тип величины, на которую указывает ссылка; & − оператор ссылки, указывающий, что следующее за ним имя является именем переменной ссылочного типа.
Примеры
int kol;
int & pal = kol; // ссылка pal − альтернативное имя kol
const char & cr = '\n'; // ссылка на константу
При работе со ссылками следует выполнять следующие правила:
1. Переменная-ссылка должна явно инициализироваться при ее описании.
2. После инициализации ссылке не может быть присвоено имя другой переменной.
3. Тип ссылки должен совпадать с типом величины, на которую он ссылается.
4. Не разрешается определять указатели на ссылки, создавать массивы ссылок и ссылки на ссылки.
Ссылки чаще всего применяются в качестве параметров функций и типов возвращаемых функциями значений (см. методические указания “Программирования на языке С++”. Часть 2. “Модульное программирование”).
Ссылка в отличие от указателя не занимает дополнительного пространства в памяти и является просто другим именем величины. Операция над ссылкой приводит к изменению величины, на которую она ссылается.
