Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование_С++_ч_1.doc
Скачиваний:
15
Добавлен:
22.11.2018
Размер:
324.61 Кб
Скачать

Инициализация указателей

Указатели используют при работе с динамической памятью. Динамическая память − это свободная память, в которой можно выделять место во время выполнения программы. Доступ к выделенным участкам динамической памяти, называемым динамическими переменными, производится только через указатели. Время жизни динамических переменных − от точки создания до конца программы или до явного освобождения памяти.

При определении указателя надо стремиться выполнить его инициализацию, т.е. присвоение начального значения.

Существуют следующие способы инициализации указателей:

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. “Модульное программирование”).

Ссылка в отличие от указателя не занимает дополнительного пространства в памяти и является просто другим именем величины. Операция над ссылкой приводит к изменению величины, на которую она ссылается.