белая методичка страница 26
Динамическими называют такие массивы, для которых количество их элементов заранее не известно и оперативная память для них выделяется в процессе выполнения программы. Рассмотрим построение динамических массивов в Си++ с помощью указателей и оператора new. Ниже приводится пример программы, реализующей создание двух динамических массивов целых чисел: одномерного массива с числом элементов, равных К (вводится с клавиатуры) и двумерного массива с числом строк N и числом столбцов M (также вводятся с клавиатуры). Первый массив создается с помощью указателя p, второй – с помощью указателя p2. Указатель p2 является указателем на указатель типа int ( в соответствии с объявлением int **p2;).
#include<stdio.h>
#include<conio.h>bv
void main ()
{
int *p;
int **p2;
int i,j,K,N,M;
clrscr();
printf("***array1 ***\n");
printf("K = ");
scanf("%d", &K);
p = new int[K];
for (i=0; i<K; i++)
{
p[i] = i+3;
printf("%d ",p[i]);
}
printf("\n***array2 ***\n");
printf("N = ");
scanf("%d",&N);
printf("M = ");
scanf("%d",&M);
p2 = new int * [N];
for (i=0;i<N;i++)
{ p2[i] = new int[M];
for (j=0;j<M;j++)
{ p2[i][j] = i + j;
printf("%d ", p2[i][j]);
}
printf("\n");
}
getch();
}
В результате выполнения этой программы при К = 6, N = 3 и M = 4 на экране получим следующую информацию:
|
Рис.5. иллюстрирует процесс создания двух динамических массивов. Для создания двумерного массива вначале выделяется свободное место в памяти компьютера для массива указателей на int и определяется значение (оператор p2 = new int * [N];, а непосредственно после выполнения этого оператора значение p2 равно адресу нулевого участка выделенной памяти). Затем выделяется свободное место для каждой строки матрицы и определяется значение каждого i -го указателя на int (оператор p2[i] = new int [M];, а непосредственно после выполнения этого оператора значение p2[i] равно адресу нулевого участка, выделенной для p2[i] области). На рис.5. показано состояние указателей непосредственно после выполнения операторов new, в этот момент значения выделенных участков еще не определены.
это так на всякий случай
В заключение раздела отметим следующее:
- Указатели – это, такие объекты программы, значения которых являются адреса других объектов, в том числе и самих указателей. Описание указателей для элементарных данных осуществляется с указанием типа объектов, на которые может указывать указатель:
int *p1;//– указатель на объект типа int
float *p2;// - указатель на объект типа float
float **p3;// - указатель на указатель на объект типа float
void *p4;// - указатель на объект без информации о типе указываемого объекта - Для указателей применяются операции: разыменования, преобразования типа, присваивания, получения адреса, сложения и вычитания, инкремента и декремента, отношений.
- Массивы – это объекты программы, состоящие из однотипных элементов, которые располагаются в оперативной памяти на соседних участках. Число индексов и диапазоны их значений должны быть заранее известны (эта информация указывается при объявлении массива). Примеры объявлений:
int f[10];// одномерный массив f из 10 элементов типа int, индекс может иметь // значения от 0 до 9
char s[15];// одномерный массив s из 10 элементов типа char, индекс может иметь // значения от 0 до 14
double V[3][4];// двумерный массив V из 3 строк и 4 столбцов, первый индекс может принимать значения от 0 до 2, второй – от 0 до 3; каждый элемент массива типа doublе. - Транслятор языка Си воспринимает только одномерные массивы. Однако элементами одномерного массива в свою очередь могут быть одномерные массивы, поэтому двумерные массивы – это массивы массивов, трехмерные – массивы массивов, у которых, опять же, элементами являются одномерные массивы, и т. д.
- Обращение к элементам массива осуществляется с помощью переменных с индексами (f[i], s[5], V[i][k]) или с помощью указателей (*( p1 +i) или p1[i],*(p3[i] + j) или p3[i][j] ). При обращении с помощью указателей должны быть выделены участки памяти для размещения соответствующих массивов с помощью оператора new.
- С помощью указателей возможно реализовать динамические массивы (массивы с заранее неизвестной размерностью).