Многоуровневые массивы указателей на строки
Для массива указателей на строки типа char*[] существует аналог -двойной указатель типа char**, который можно интерпретировать как указатель на массив указателей на строки. При этом типы char*[] и char** соотносятся как указатель-константа и указатель-переменная(см п.4.1). Двойной указатель может использоваться для работы с динамическими массивами строк. В последнем случае как сами строки, так и массив указателей на них представлены динамическими переменными. В качестве примера рассмотрим создание массива указателей на строки при чтении последних из файла.
//------------------------------------------------------bk52-04.cpp
#define SIZE0 100
char **loadfile(FILE *fd)
{
char **pp,*q,str[80];
int i;
pp = new char* [SIZE0]; // Создать динамический
if (pp ==NULL) return(NULL); // массив указателей
for (i=0; fgets(str,80,fd) !=NULL; i++)
{ // Читать строку из файла
q = new char [strlen(str)+1];
if (q==NULL) return(NULL); // Создать динамический
strcpy(q,str); // массив символов и
// копировать туда строку.
pp[i] = q; // Сохранить указатель
if ((i+1) % SIZE0 ==0) // Расширить массив указа-
{ // телей при переполнении
pp = realloc(pp,sizeof(char *) *(i+1+SIZE0));
if (pp ==NULL) return(NULL);
}
}
pp[i] = NULL; // Ограничитель массива
return pp; // указателей
}
Определенный смысл имеют и конструкции вида:
char **pp[20]; char ***ppp;
Если массив указателей на строки имеет смысл страницы текста, то тогда такие конструкции могут использоваться для представления в памяти текста, разбитого на страницы.