Лекции по проге / 10_1_Указатели_Основы
.pdf
Инициализация указателя адресом переменной
<переменная-указатель> = & <переменная>;
где & - унарная операция взятия адреса, которая возвращает адрес переменной
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
