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

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

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

Лекция №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