- •Часть 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. “Модульное программирование”).
Ссылка в отличие от указателя не занимает дополнительного пространства в памяти и является просто другим именем величины. Операция над ссылкой приводит к изменению величины, на которую она ссылается.