Каждый элемент такого массива является указателем на переменную. Тип переменной должен быть таким же, как базовый тип массива указателей.
Пример инициализации массива указателей существующими адресами
#include <iostream>
using namespace std ;
int main ( )
{
const int SIZE = 4 ;
int array [ SIZE ] = { 5, -3, 0, 17 } ;
// объявление массива указателей на целый тип
int* p [ SIZE ] ;
// инициализация массива указателей адресами
for ( int i = 0; i < SIZE; i++ ) p [ i ] = & array [ i ] ;
// вывод состояния массива указателей
for ( int i = 0; i < SIZE; i++ ) cout << p [ i ] << '\t' ;
cout << endl ;
// вывод значений через массив указателей
for ( int i = 0; i < SIZE; i++ ) cout << * p [ i ] << "\t\t" ;
cout << endl ;
return 0 ;
}
Для присвоения элементу массива указателей значения адреса переменной типа, на который он указывает, следует выполнить операцию взятия адреса (&) для переменной. Чтобы получить значение переменной, на которую указывает элемент массива указателей, необходимо разыменовать указатель.
Пример динамического формирования массива указателей
#include <iostream>
using namespace std ;
const int SIZE = 4 ;
int main ( )
{
// инициализация массива указателей адресами
// и значениями по выделенным адресам
int* p [ SIZE ], x ;
for ( int i = 0; i < SIZE; i++ )
{
cout << "-> " ; cin >> x ;
p [ i ] = new int ( x ) ;
}
// вывод состояния массива указателей
for ( int i = 0; i < SIZE; i++ ) cout << p [ i ] << '\t' ;
cout << endl ;
// вывод значений через массив указателей
for ( int i = 0; i < SIZE; i++ ) cout << * p [ i ] << "\t\t" ;
cout << endl ;
// освобождение памяти
for ( int i = 0; i < SIZE; i++ ) delete p [ i ] ;
return 0 ;
}
Следует помнить:
- базовый тип массива указателей, тип в операторе new и тип переменной, адрес которой хранится в массиве указателей, должны совпадать;
- выделенные боки памяти должны быть освобождены после их использования;
-освобождается оперативная память для массива указателей с помощью оператора delete для каждого указателя отдельно.
Динамический двумерный массив создается в процессе исполнения программы. Количество строк и количество столбцов двумерного массива определяется по ходу выполнения программы. Сначала выделяется блок памяти для массива указателей на количество строк матрицы. Далее в цикле выделяются блоки памяти размером на количество столбцов, начальные адреса которых передаются соответствующему указателю из массива указателей.
Пример создания динамического двумерного массива
#include <iostream>
using namespace std;
int main ( )
{
double** p ; // указатель на указатель
// ввод количества строк m и столбцов n
int m, n ;
cout << "Enter quantity of rows\t-> " ; cin >> m ;
cout << "Enter quantity of columns\t-> " ; cin >> n ;
// выделение памяти для массива указателей на строки
p = new double* [ m ] ;
// выделение памяти для элементов строк
for ( int i = 0; i < m; i++ ) p [ i ] = new double [ n ] ;
// заполнение матрицы значениями
for ( int i = 0; i < m; i++ )
for ( int j = 0; j < n; j++ ) cin >> p [ i ] [ j ] ;
// вывод матрицы
for ( int i = 0; i < m; i++ )
{
for ( int j = 0; j < n; j++ )
cout << p [ i ] [ j ] << '\t' ;
cout << endl ;
}
// освобождение памяти
for ( int i = 0; i < m; i++ ) delete [ ] p [ i ] ;
delete [ ] p ;
return 0 ;
}
Указатель на указатель р позволяет обращаться к элементам матрицы так, как если бы она была объявлена обычным способом. В конце программы выделенная память освобождается в два этапа:
1 этап: - в цикле освобождается память для каждой строки отдельно;
2 этап: - освобождается память от массива указателей.