Читайте также: |
|
Указатели могут указывать на элементы массива. К указателям на элементы массива применимы арифметические операции для получения указателей на другие элементы массива. Например, если p указывает на x[5] из массива x, то p + 3 есть значение указателя на x[8 ], а p – 4 есть значение указателя на (т. е. адрес) элемент x[1]. Мы можем использовать операции ++ или – для продвижения указателя к следующему или предыдущему элементу массива. Тип элементов явно не специфицируется при использовании указателей в выражениях. Выражение p + 3 в действительности есть адрес, получаемый как
(the value of p) + 3 * sizeof (element of x).
Разность двух указателей также может быть вычислена: если p указывает на x[4] и q указывает на x[8], то q - p = 4, а p - q = - 4. Более того, p > q и p == q есть false, а p!= q и q > p - true. Программист ответственнен за арифметические действия над указателями: выход за пределы массива обычно приводит к плохим последствиям.
Указатели на элементы массива могут быть использованы в нотации массивов: если p указывает на x[5], то выражение p[3] есть то же самое, что и *(p + 3), т.е.., x[8].
С другой стороны, имя массива может использоваться в качестве указателя на первый элемент массива. Поэтому, если x – массив из 10 целых, то *(x + 5) есть то же самое, что и x[5]. Если p – указатель на int, мы можем написать p = x + 5. Но, так как имя массива не является модифицируемым l-value, выражения x++ и x = p не допустимы.
(iii) Динамические массивы (ранее мы уже коротко это обсуждали…)
Указатели можно использовать для создания динамических массивов (dynamic arrays). Олерация new выделяет память под массив во время выполнения программы.
int * p;
…
p = new int[10];
// выделяет память под массив из 10 элементов целого типа,
// p указывает на первый элемент массива.
Элементы массива в этом случае доступны как в нотации для указателей, *(p + 3), например, так и нотации для массивов (по индексу) - p[3].
Так как память для динамических массивов выделяется в куче (heap), то она должна быть вовремя освобождена операцией delete. Используйте cинтаксис
delete [ ] p;
для освобождения памяти, ранее выделенной по указтелю p. Размер массива не указывается.
Следующий фрагмент кода создает трехмерный динамический массив:
int *** p = new int**[5];
// p is a pointer to an array of 5 pointers to pointer to int.
for (int i = 0; i < 5; ++i)
{
p[i] = new int*[4];
// p[i] is a pointer to an array of 4 pointers to int.
for (int j = 0; j < 4; ++j)
{ p[i][j] = new int[3]; }
// p[i][j] is a pointer to an array of 3 int.
}
Здесь p “головной” (управляющий) указатель трехмерного массива p[5][4][3]. Позже мы должны уничтожить массив, действуя в обратном порядке:
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 4; ++j)
{ delete [ ] p[i][j]; }
delete [ ] p[i];
}
delete [ ] p;
Дата добавления: 2015-11-16; просмотров: 131 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Явное приведение типа | | | V) Массивы и функции |