Формирование массивов указателей
-указуемые элементы (переменные) могут быть как обычными (статическими) переменными, создаваемые транслятором, так и динамическими переменными, создаваемыми в процессе работы программы;
-указатели (связи между элементами) могут быть либо инициализированы (установка начальных значений при трансляции), так и назначены в процессе выполнения программы.
В результате получаются структуры данных, единственное различие которых заключается во времени их формирования: от момента трансляции (инициализация) до момента выполнения.
Вариант 1. Формирование структуры данных при трансляции: переменные определяются статически, а указатели инициализируются. Такие структуры данных включены непосредственно в программный код и "готовы к работе":
double a1,a2,a3, *pd[] = { &a1, &a2, &a3, NULL};
Вариант 2. Переменные определяются статически, указатели устанавливаются программно. Этот вариант наиболее часто используется, когда указуемые переменные представлены массивом:
double d[19], *pd[20];
for (i=0; i< 19; i++) pd[i] = &d[i];
pd[i] = NULL;
Примечание: указатель NULL обычно используется в массиве в качестве ограничителя последовательности указателей, если их количество меняется.
Вариант 3. Указуемые переменные создаются динамически, массив указателей -статически:
double *p, *pd[20];
for (i=0; i< 19; i++)
{
p = new double; *p = i; pd[i] = p;
}
pd[i] = NULL;
Вариант 4. Все переменные, в том числе и массив указателей, создаются динамически. Результатом работы является указатель на создаваемый массив указателей (адрес массива указателей) (см. ниже " динамические массивы указателей " ):
double **pp, *p;
pp = new double *[20]; // память под массив
for (i=0; i< 19; i++) // из 20 указателей типа double*
{
p = new double;
*p = i; pp[i] = p;
}
pp[i] = NULL;