Если в программе нужно использовать массив, размер которого заранее не известен, то необходимо размещать такой массив в динамической памяти. Для выделения памяти для массива служит операция new:
new имя_ типа[количество_элементов];
Она возвращает указатель на выделенную память.
float *pa;
pa = new float [25];
Теперь по адресу, хранящемуся в pa, можно разместить массив из 25 элементов типа float.
Правила хорошего тона гласят, что выделенную память после использования необходимо освобождать. Для этих целей служит операция delete:
delete [] pa; // Освобождение памяти, выделенной для массива
Пример. Вести с клавиатуры размер одномерного массива типа int. Разместить его в области динамического распределения памяти. Присвоить значения его элементам по формуле A[i]=i. Вывести их на экран. Освободить память.
#include <stdio.h>
void main()
{
int i, N, *pi;
printf("N=");
scanf("%d",&N);
pi = new int[N];
for (i=0; i<N; i++)
{
*(pi+i) = i;
printf(" *(pi+%d)=%d \n", i,*(pi+i));
}
delete [] pi;
}
Результат работы программы:
N=5
*(pi+0)=0
*(pi+1)=1
*(pi+2)=2
*(pi+3)=3
|
|
*(pi+4)=4
Массивы указателей
Так как указатель это переменная в которой хранится адрес ячейки памяти, то язык С++ позволяет объявить массив указателей:
тип *имя_массива[размер_массива];
Объявим массив указателей из 3 элементов на объекты типа int.
int *array [5];
В таком массиве указателей можно хранить адреса различных целочисленных переменных.
#include <stdio.h>
void main()
{
int *array[3];
int a = 10, b = 20, c = 30;
array[0] = &a;
array[1] = &b;
array[2] = &c;
for (int i = 0; i<3; i++)
printf("%p\n", array[i]);
}
Это не основное применение массивов указателей, которые удобно применять при работе с многомерными массивами.
Занятие 5. Указатели и многомерные массивы.