Лексические основы языка C ++. Алфавит и лексемы языка C++. Операторы C++. Массивы и указатели, страница 9

     delete [размер_массива] указатель;

     delete указатель;

B C++ каждая символьная строка представляется в виде одномерного массива, который заканчивается нулевым символом “\0”.

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

Многомерный массив трактуется через понятие одномерного массива. Определение многомерного массива:

type имя_массива[k1][k2]…[kN];

где N – размерность массива, k1 – количество элементов размерности (N-1) каждый.

int m[4][3][6]; /*это одномерный массив из 4

                  элементов, каждый из которых имеет

                  тип int [3][6], т.е. является

                  двумерным массивом.*/

            В памяти такой массив размещается в порядке возрастания самого правого индекса

array [3]                                                                                    array [0]

массив 3 на 6

массив 3 на 6

 ar[i][2]

ar[i][0]

Массив из 6 элементов

Массив из 6 элементов

ar[i][j][5]

ar[i][j][0]

int

int

<----------<----------------возрастание адресов----------<----------------

Инициализация многомерного массива с помощью списка инициализации

int ar[2][3]={1,2,3,4,5,6}

[0][2]

[0][1]

[0][0]

3

2

1

[1][2]

[1][1]

[1][0]

6

5

4

Имя массива – всегда константа-указатель. Для массива, определенного как

ar[N][M][L], ar – указатель, поставленный в соответствие элементам типа type [M][L]. Прибавление единицы к указателю ar увеличит значение указателя на массив на величину

sizeof(type)*M*L

В общем случае для трехмерного массива обращение к элементу приводит к следующему раскрытию ссылок:

ar[i][j][k]

*(*(*(ar+i)+j)+k)

Смещение:

ar+sizeof(type)*M*L

Динамические массивы

new имя_массива      /*возвращает указатель, значением

                  которого служит адрес первого

                  элемента массива */

            Динамические массивы не инициализируются, поэтому их размер должен быть явно определен при выделении памяти.

            Описание указателя на массив:

type(*имя_массива)[константное выражение];

            Пусть надо динамически выделить память для трехмерного массива:

1)  Надо определить указатель на двумерный массив заданной размерности.

2)  Выделить память под трехмерный массив

long(*lp)[2][4];

lp=new long[3][2][4];

            Только самый левый индекс многомерного массива может быть переменной величиной, остальные индексы должны быть заданы как константы.

Избежать этого ограничения позволяет использование массива указателей.

Массивы указателей

Определение массива указателей:

new имя_массива

type *имя_массива[константное_выражение]

int *array[6];                 // Массив указателей на объекты целого типа

int (*ptr)[6];                   // Указатель на массив из 6-ти элементов типа int

(array+1) // увеличение на sizeof(int*)

(ptr+1) // увеличение на 12 байт, т.е.sizeof(int[6])

Создание и распечатка одномерного массива указателей на динамические строки, вводимые с клавиатуры

#include <stdio.h>

#include <string.h>

#include <alloc.h>

char *ReadString()

{

 char *p;//указатель на символьный массив

 char buffer [128];//буфер для чтения символов}

 gets(buffer)

 p=new char [strlen(buffer)+1]

 strcpy(p,buffer);

 return p;

}

void main()

{char * array[10];

 int i;

 for(i=0;i<10;i++) array[I]=ReadString();

 for(i=0; i<10;I++) puts(array[i]);

}

Освобождение памяти, занятой массивом.

delete [ ] указатель;

delete [размерность_массива] указатель;