Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по проге / 10_1_Указатели_Основы

.pdf
Скачиваний:
31
Добавлен:
14.03.2016
Размер:
213 Кб
Скачать

Инициализация указателя адресом переменной

<переменная-указатель> = & <переменная>;

где & - унарная операция взятия адреса, которая возвращает адрес переменной

11

Задание

Объявить целочисленную переменную i, инициализированную нулем

Объявить указатель на целое число pInt

Присвоить указателю pInt адрес переменной i

pInt 0 i

12

Пример инициализации указателя

int i = 0;

int *pInt; pInt = &i;

// или

int *pInt = &i;

13

Операции над указателями

 

*

 

операция обращения по адресу

==

!=

>

операции сравнения

<

>=

<=

 

+

++ -

--

арифметические операции

=

+=

-=

операции присваивания

(<тип> *)

приведение типов

14

Операция обращения по адресу

Унарная операция * позволяет обратиться к значению, хранящемуся по заданному адресу

* <переменная-указатель> * <выражение типа указатель>

Операция возвращает l-value-выражение, следовательно полученное значение можно не только считывать, но и модифицировать

Операция применяется только к типизированным 15 указателям

Задание

Указатель pInt ссылается на целочисленную переменную i

 

pInt

 

 

 

 

 

 

 

0

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Напечатать на экране значение по адресу pInt

 

Записать по адресу pInt число 5

 

Увеличить на единицу значение по адресу pInt

16

Напечатать на экране значение переменной i

Пример обращения по адресу

printf("*pInt = %d\n",*pInt);

*pInt = 5;

(*pInt)++; /* Обратите внимание на круглые скобки! Приоритет операции * ниже, чем у постфиксного ++ */

printf("i = %d\n", i);

*pInt = 0 17 i = 6

Сравнение указателей

Сравнивая указатели, мы сравниваем адреса ячеек памяти

Равенство указателей показывает, что они ссылаются на один и тот же участок памяти

p2

p1 0 i

p1 == p2 истина

18

Адресная арифметика (задание смещения)

<переменная-указатель> ± K

где <переменная-указатель> - типизированный указатель

K целочисленное выражение, которое задает смещение в памяти

Как результат возвращается новый адрес памяти равный

 

<адрес в переменной-указателе> ±

19

K * <размер базового типа данных>

 

Адресная арифметика (задание смещения)

int array[15] = {4};

 

 

 

 

int *pointer =

 

&array[0];

 

 

 

 

pointer

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0x04

0x00

0x00

0x00

 

...

...

...

...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

array[1]

 

 

 

 

 

 

 

 

array[0]

*(pointer + 1)

= 3;

 

 

 

 

 

 

 

pointer

 

 

 

 

 

 

 

0x04

0x00

0x00

0x00

 

0x03

0x00

0x00

 

0x00

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

array[0]

 

 

array[1]

 

 

pointer + 1

20