пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ


6. Языки программирования С и С++. Указатели: определение, примеры, адресная арифметика. Указатель на константу, константный указатель, их отличия. Примеры. Работа с динамической памятью в С++. Операции new и delete. Примеры работы с динамическим массивом, динамической матрицей. Ссылки и их использование.

Переменная типа «указатель на <тип>» — переменная, способная хранить адреса переменных с типом, указанным при ее объявлении

Синтаксис:

              <тип>* <идентификатор>;

Пример:

              int* pi;                        // pi – указатель на int

              double* pd;                // pd – указатель на double

              char* pc;                    // pc – указатель на char

Условно оперативную память вычислительной машины можно представить в виде длинной ленты, последовательности "ячеек" для хранения информации. Каждая такая ячейка размером в 1 байт имеет индивидуальный номер, называемый адресом. Пусть имеется переменная целого типа:  

int  a, b[10];

Определим новые переменные:

int *p_a, *p_b[10];

Эти новые переменные называется указателями и могут хранить адреса размещения в оперативной памяти переменных соответствующего типа. Например, переменная p_a предназначена для хранения адреса переменной целого типа, p_b – для хранения адресов массива целого типа.

Определение адреса размещения переменной в оперативной памяти компьютера осуществляется с помощью унарной операции & :

p_a = &a; // переменной p_a присваивается адрес переменной a

С указателями (адресными переменными) можно выполнять целочисленные арифметические операции по следующим правилам:

Добавление единицы к указателю увеличивает его значение на величину, равную длине типа переменной (в байтах), на которую он указывает; тем самым обеспечивается переход в оперативной памяти к следующей переменной, расположенной вслед за текущей.

Аналогично, вычитание единицы приводит к противоположному результату

Указатели очень тесно связаны с размещением массивов данных в оперативной памяти компьютера. Имя массива в действительности является указателем на адрес первого элемента этого массива.

Операции *(b+i) и b[i] являются тождественными. Это означает, что значение элемента массива может быть получено (задано) с помощью адресных операций и наоборот.

Разыменовывание — обращение к переменной, на которую указывает указатель

Синтаксис:

              *<указатель>

Тип у этого выражения — <тип> из объявления указателя

Указатель на объект любого типа можно присвоить переменной типа void*, указатели типа void* можно сравнивать друг с другом

Указатель void* – указатель на «сырую память», не имеющую типа, его нельзя разыменовывать, использовать в арифметических операциях и др.

Пример:

              int i, *pi; double* pd;

              void* p = &i;

Указатель на константу не может менять значение объекта, на который указывает, но может быть переуказан на другой объект

Синтаксис:

              const <тип>* <идентификатор>

Константный указатель может менять значение объекта, на который указывает, но не может быть переуказан на другой объект

Синтаксис:

              <тип>* const <идентификатор>
Константный указатель на константу не может менять значение объекта, на который указывает, не может быть переуказан на другой объект

Синтаксис

              const <тип>* const <идентификатор>

Для выделения и освобождения динамической памяти в С++ используются операторы new и delete.

Запрос памяти во время выполнения программы

• один экземпляр

              <тип>* <указатель> = new <тип>;

• n экземпляров

              <тип>* <указатель> = new <тип>[n];

Освобождение памяти

• один экземпляр

              delete <указатель>;

• n экземпляров

              delete[] <указатель>;

Кроме этого, возможно выделение памяти с одновременной инициализацией переменных:

Int *c=new int(12);

Синтаксис объявления массива из указателей:

              <тип>* <имя>[<размер>];

              (<тип>*) <имя>[<размер>];

Синтаксис объявления указателя на массив:

              <тип> (*<имя>)[<размер>];

Примеры:

              int* array_of_pointers[5];

              int (*pointer_to_array)[5];

Наряду с адресными переменными (указателями) определяется понятие ссылочных типов, которые фактически позволяют вводить дополнительные (“другие”) имена переменных величин. Для определения переменной типа ссылки используется символ & .

int  i = 123;

int &j=i, *k; // теперь идентификатор j является другим именем переменной i

j = 678; // переменной i присвоено значение 678

k = &j;  // адресной переменной k присваивается адрес переменной i

j++;// переменная i увеличивается на единицу

*k = 10;

j = 10;

Две последние операции эквивалентны по своим последствиям.

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


10.06.2015; 08:27
хиты: 663
рейтинг:0
Точные науки
информатика
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь