Информатика и технология программирования

         

Массивы указателей на строки


Другой широко распространенной интерпретацией массива указателей является трактовка каждого из них как указателя на массив (статический или динамический) указуемых переменных. Для указуемых переменных типа char (символы) эта структура данных обычно понимается как массив указателей на строки и имеет определение:


char *pc[20];

Существуют различные варианты формирования массива указателей на строки.

Вариант 1. Массив указателей создается статически, строки инициализируются константами, указатели также инициализируются -вся структура данных включается в программный код (Напомним, что строковая константа во всех контекстах понимается как указатель на сформированный транслятором массив, инициализированный символами строки):


char *pc[] = { "aaa", "bbb", "ccc", NULL};

Вариант 2. Массив указателей создается статически, для размещения строк используется двумерный массив символов (массив строк), указатели назначаются программно:


char *pc[20], cc[19][80];
for (i=0; i&#60 19; i++) pc[i] = cc[i];
pc[i] = NULL;

Здесь используются две особенности организации двумерных массивов. Во-первых, двумерный массив интерпретируется как массив элементов первого индекса, состоящих из элементов второго индекса, в данном случае -19 массивов символов по 80 символов в каждом. Во-вторых, идентификатор двумерного массива с одним индексом интерпретируется как указатель на начало соответствующего массива элементов второго индекса, в данном случае -указатель на i-й массив из 80 символов (строку).

Вариант 3. Сами строки создаются как динамические массивы, а указатели на них устанавливаются программно. В качестве примера рассмотрим ввод строк с клавиатуры и размещение их в динамических массивах, соответствующих размерности строк:


char *pc[20], *p, c[80];
for (i=0; i&#60 19; i++)
{
gets(c); // ввод строки


if (strlen(c)==0) break; // пустая строка - конец


p = new char [strlen(c)+1]; // динамический массив


strcpy(p,c); // под строку


pc[i] = p;
}
pc[i] = NULL;

Вариант 4. Массив указателей также создается в динамической памяти:


char **pp, *p, c[80];
pp = new char* [20]; // динамический массив


for (i=0; i&#60 19; i++) // из 20 указателей char*


{
gets(c); // ввод строки


if (strlen(c)==0) break; // пустая строка - конец


p = new char [strlen(c)+1]; // динамический массив


strcpy(p,c); // под строку


pp[i] = p;
}
pp[i] = NULL;



Содержание раздела