- •Адреса, указатели, ссылки, массивы Указатели и адреса объектов
- •Объявление и инициализация указателей
- •Инициализация указателей
- •Указатели константы и на константы
- •Типы указателей и операции над ними
- •Указатели на основные типы данных - на арифметические данные и на символьные.
- •Операции над указателями
- •Понятие указателя на указатель
- •Аддитивные операции
- •I. Вычитание
- •Вычитание из указателя целое число:
- •II. Сложение указателя с целым значением
- •Объявление ссылки
- •Инициализация ссылок не обязательна:
- •Массивы
- •Форма объявления одномерного массива (вектора) type имя массива [k];
- •Type имя массива [ k 1] [ k2] …[kn];
- •Внутреннее представление массивов в оперативной памяти
- •Инициализация числовых и символьных массивов.
- •Инициализации символьных массивов
- •Массивы и указатели
- •Указатели и строки
- •Ввод/вывод элементов массивов Ввод/вывод числовых массивов
- •Ввод/вывод символьных массивов
- •Создание динамических массивов.
- •Имя указателя [индекс элемента]
- •Массивы указателей
- •Создание двумерного динамического массива с помощью динамического массива указателей.
- •Указатель на массив. Многомерные массивы динамической памяти.
- •Определение типа массива
- •Определение типа указателя на массив
Объявление и инициализация указателей
В простейшем случае объявление указателя имеет вид:
type * имя указателя;
В определении указателя обязательно должен быть указан тип данных, на который "указывает" указатель, так как указатель несет информацию об адресе участка памяти и о размерах этого участка памяти.
type– это тип объекта, на который "указывает" указатель,
type * – это тип указателя, если рассматривать указатель как переменную.
Например, в объявлении:
int*A, *B, *C, D;
объявлено три указателя A ,B , C на данные типа int и переменная D- типа int.
Инициализация указателей
Инициализация указателей имеет две формы:
type * имя указателя = инициирующее выражение ;
type * имя указателя (инициирующее выражение );
В качестве инициирующего выражения может быть:
явно заданный адрес участка памяти:
type * имя = ( type * ) 0x158e0ffc;
выражение, возвращающее адрес объекта с помощью операции '&':
type count ; type_1* iptr = (type_1*) &count;
указатель, имеющий значение:
char ch = '+', *R = &ch; char *ptr = R;
инициирующее выражение равно пустому указателю:
NULL ( nullptr) – специальное обозначение указателя ни на что не указывающего.
char * ch (0) эквивалентно char * ch (nullptr).
Доступ к значению объекта, адресуемому указателем,
Доступ обеспечивает операция разыменования, выражение:
*имя указателя;
позволяет получить значение самого объекта:
char cc = 'a', *pc = &cc;
cout<< *pc;
и изменить это значение:
*pc = '+'; cin>> *pc;
Можно сказать, что выражение *указатель – обладает правами переменной.
Если определен указатель без инициализации:
сhar *p,
использовать выражение *p в операциях присваивания или в операторе ввода не правомерно.
Указатель p не обладает значением - адресом участка памяти, куда можно было занести значение.
Указателю можно присвоить адрес участка памяти объекта типа char:
1) p = new char ;//динамическое выделение, delete (p) -//освобождение памяти
2) p = (char *) 0x157e0ffc; //значение адреса преобразуется к //указателю char*
3) p =(char*) malloc ( sizeof ( char));
// динамическое выделение памяти free (p) – освобождение памяти
p присвоить адрес переменной типа char:
char c; p = &c;
p присвоить значение другого указателя на данные типа char*:
char s, *ptr=&s; p=ptr;
Теперь допустимы операции *p ='+'; cin>> *p;
Указатели константы и на константы
Указатели бывают константами (то есть значение указателя нельзя поменять в программе) и указателями на константы (то есть указатель, адресующий неизменный участок памяти).
В общем случае определение константного указателя на константу имеет вид:
type const * const имя указателя;
в этом определении type const – тип константы, на которую "указывает" указатель.
А в последующей части после разделителя '*' - const имя указателя определяется имя константного указателя.
В этом случае нельзя изменить значения указателя и нельзя изменить значение участка памяти, на который "указывает" указатель.
Определение константного указателя
type* const имя указателя;
Например, в определении:
char * const K = ( char * ) 1047;
K– это указатель, значение которого невозможно изменить.
Возможно менять значения по адресу К, то есть допустимы операции: *К = '*'или cin>> *K;
Определение указателя на константу имеет вид:
type const * имя указателя;
Например, после определений:
сonst float A = 56.1; float B = 1.1; float const *рA = &A ;
не допустимы операции изменения значения *рA, но допустимо разорвать связь указателя рA с константой А, присвоив указателю адрес другой переменной: рA =&B; и тогда допустимы, например: *рA=0.1 или cin>>*рA;
Еще раз отметим свойства операции взятия адреса - '&' столь важной для инициализации указателей.
Операция '&' применима только к объектам, имеющим имена и размещенным в ОП.
