Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
69
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

7.2 Разыменование и разадресация

Основной операцией при работе с указателями является получение доступа к значению, адрес которого хранится в указателе. Например,

int *pn, n;

*pn = 5;

n = *pn;

В операторе *pn = 5; “*” означает операцию, посредством которой из имени указателя получается “имя” того значения, на которое он указывает. Операция называется разыменование .

Операция, обратная к разыменованию, позволяет получить адрес переменной по ее имени. Например,

pn = &n;

Эта операция называется разадресацией.

7.3 Операции new и delete

Операция new, выполненная над некоторым типом, резервирует место в динамической памяти, необходимое для хранения значения этого типа. Результатом операции является адрес выделенной памяти или NULL, если выделить память не удалось. Тип результата — “указатель на заданный тип”.

float* pf;

pf = new float;

После того, как динамическая память выделена, ее можно использовать при помощи разыменования.

*pf = 3.14;

float f = *pf + 1.414;

Операция new не инициализирует выделяемую память, т.е. не заполняет ее никакими значениями.

Когда надобность в выделенной памяти отпадет, ее надо освободить при помощи операции delete.

delete pf;

З а м е ч а н и е. При неудаче операции new вызывается функция-обработчик ошибки. Ссылка на требуемый обработчик передается в качестве параметра функци

set_new_handler(&функция-обработчик),

описаной в заголовочном файле new.h.

7.4 Массивы

З а д а ч а.Ввести 10 чисел и сохранить их в памяти.

Р е ш е н и е.

#include <iostream.h>

void main(){

float a[10];

for (int i = 0; i < 10; i++) cin>>a[i];

}

При определении массива количество элементовзадается константным выражением. Элементы массива всегда нумеруются от 0 до n-1.

В определении “float a[10]” [ ] означают операцию над базовым типом float и целым значением 10. Результатом операции является новый тип — массив из 10 вещественных чисел. Необычным является лишь то, что обозначение типа “массив” не предшествует имени переменной, как в

int n; или float* pf

а окружает его. Логичнее было бы

float[10] a

но это противоречит традиции языков программирования.

Новому типу можно дать собственное имя.

typedef float TFArray [10];

TFArray a;

При необходимости инициализация массивав С++ выполняется так:

int m[ ] = {1,2,3}; // определен и инициализирован массив из 3 элементов.

Чтобы обратитьсяк 5-му элемента массива a, надо написать a[5]. Здесь [ ] адресная операция, которая из имени (адреса) массива и числа 5 вырабатывает адрес шестого по порядку элемента массива.

7.5 Многомерные массивы

Двумерный массив — это массив из одномерных массивов. Пример определения двумерного массива:

typedef int ARR[100];

ARR m[10];

или по другому

int m[10][100];

З а д а ч а. Ввести матрицу размера 2х3. Поменять местами начальную и последнюю строки и вывести результат на экран.

7.6 Связь между массивами и указателями

Хотя указатель char* M и массив char M[100] — разные типы данных, имя M рассматривается транслятором как указатель на начальный (нулевой) элемент массива. Адресные выражения M[n] и *(M+n) эквивалентны.

З а д а ч а. Скопировать содержимое массива А в массив В.

Р е ш е н и е.

void main(){

int A[ ]={1,2,3,4,5,6,7,8,9}, B[9];

int i;

// 1-й способ

for (i=0; i<9; i++) B[i] = A[i];

// 2-й способ

for (i=0; i<9; i++) *(B+i) = *(A+i);

// 3-й способ

int *a, *b;

for (a=A, b=B, i=0; i<9; i++) *(b++) = *(a++);

}

Вычитание указателей имеет смысл, только если оба они указывают на элементы одного массива.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]