Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
указатели_new - копия.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
233.08 Кб
Скачать

Объявление и инициализация указателей

В простейшем случае объявление указателя имеет вид:

type * имя указателя;

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

type– это тип объекта, на который "указывает" указатель,

type * – это тип указателя, если рассматривать указатель как переменную.

Например, в объявлении:

int*A, *B, *C, D;

объявлено три указателя A ,B , C на данные типа int и переменная D- типа int.

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

Инициализация указателей имеет две формы:

type * имя указателя = инициирующее выражение ;

type * имя указателя (инициирующее выражение );

В качестве инициирующего выражения может быть:

  1. явно заданный адрес участка памяти:

type * имя = ( type * ) 0x158e0ffc;

  1. выражение, возвращающее адрес объекта с помощью операции '&':

type count ; type_1* iptr = (type_1*) &count;

  1. указатель, имеющий значение:

char ch = '+', *R = &ch; char *ptr = R;

  1. инициирующее выражение равно пустому указателю:

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) – освобождение памяти

  1. p присвоить адрес переменной типа char:

char c; p = &c;

  1. 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;

Еще раз отметим свойства операции взятия адреса - '&' столь важной для инициализации указателей.

Операция '&' применима только к объектам, имеющим имена и размещенным в ОП.