Лекции по проге / 10_1_Указатели_Основы
.pdf
Лекция №10.1 Указатели: основы
●Память и указатель
●Действия с указателями
●Связь между указателями и массивами
●Передача параметров функции по адресу
●Типовые ошибки при работе с указателями
1
Организация памяти компьютера
●Во время работы программы необходимые ей данные (команды, значения констант и переменных) хранятся в памяти компьютера
●Память компьютера может быть представлена как большой одномерный массив. Элементом массива является ячейка памяти размером 1 байт
●Переменные и константы, занимающие более одного байта, хранятся в нескольких последовательно расположенных ячейках
2
Организация памяти компьютера |
|||||
● Номер (индекс) первой ячейки, занимаемой неко- |
|||||
торой переменной, называется ее адресом |
|||||
char symbol = 9; |
// 1 байт |
|
|
|
|
int number = 258; |
// 4 байта, шестнадцатеричное |
||||
|
// представление 0 x 00 00 01 02 |
||||
адрес переменной |
|
|
адрес переменной |
|
|
symbol |
|
|
number |
|
|
0x37100001 |
|
0x37458977 |
0x37458978 |
0x37458979 |
0x37458980 |
... 0x09 |
... |
0x02 0x01 0x00 0x00 ... |
|||
переменная symbol |
переменная number |
||||
3 |
|
|
|
|
|
Указатель
●Переменная, хранящая адрес памяти, называется указателем
●Логическое представление указателя
|
|
|
|
УКАЗАТЕЛЬ на |
|
|
|
|
|
|
|
|
|
|
|
|
|
number |
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
258 |
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
перем. number |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
● Физическое представление указателя |
|
|
|
|
|||||||||||||||||||||||||||
|
|
|
0x37100001 |
|
|
|
|
|
|
|
|
|
|
|
0x37458978 |
|
0x37458979 |
0x37458980 |
|||||||||||||
|
|
|
|
|
|
|
0x37458977 |
||||||||||||||||||||||||
|
... |
|
|
|
|
|
|
... |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
... |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||||||
|
|
0x09 |
|
|
|
0x02 |
|
0x01 |
|
|
0x00 |
0x00 |
|
||||||||||||||||||
|
|
|
|
|
|
|
|
symbol |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
переменная |
|
|
|
|
|
|
|
|
переменная number |
|||||||||||||||||||||
|
|
|
|
|
0x56789823 |
0x56789824 |
0x56789825 |
0x56789826 |
|
|
|
|
|||||||||||||||||||
|
|
|
|
... |
|
|
|
|
|
... |
|
||||||||||||||||||||
|
|
|
|
0x77 |
0x89 |
0x45 |
0x37 |
|
|
||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
4 |
|
|
|
|
|
УКАЗАТЕЛЬ на перем. number - |
|
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
содержит адрес переменной |
|
|
|
|
||||||||||||||||||||
Назначение указателя
●Организация ссылок между переменными
●Передача параметров в функцию по адресу
●Работа с динамической памятью
5
Объявление указателя
● Объявление типизированного указателя:
<базовый тип> * <имя переменной>;
указатель — тип данных
где <базовый тип> - тип того значения, на которое ссылается указатель
● Объявление нетипизированного указателя: void * <имя переменной>;
●Нетипизированный указатель может ссылаться на значения любого типа
6
Задание
Объявить следующие переменные-указатели:
–pInt — указатель на целое число
–pointer — нетипизированный указатель
–ppFloat — указатель на указатель на дробное число одинарной точности
pInt |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pointer |
|||||
|
|
|
|
|
|
|
|
|
|||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
|
|
|
|
ppFloat |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Пример объявления указателей |
|
int * pInt; |
// указатель на целое число |
void * pointer; |
// нетипизированный указатель |
float ** ppFloat; // указатель на указатель |
|
|
// на дробное число |
указатель на дробное число — базовый тип данных |
|
8 |
|
Инициализация указателя
● Переменной-указателю можно присвоить константное значение, равное некоторому адресу памяти, например:
int *pInt = (int *)0x00120000;
●Однако обращение к памяти через такой указатель, скорее всего, приведет к нарушению работы программы, т.к. назначение этой памяти не определено — в ней либо хранятся данные, формат которых не известен, либо память ничем не занята
9
Инициализация указателя
Существуют три способа корректно задать начальное значение указателю:
●присвоить адрес переменной;
●присвоить адрес начала массива;
●присвоить адрес динамически выделенной памяти.
10
