Строки как структуры данным могут быть организованы несколькими различными способами. Первый способ – дескрипторный. В этом случае строка представляет собой массив символов, первый элемент массива является дескриптором, т.е. содержит информацию о длине строки. Непосредственно символы строки хранятся, начиная только со второго элемента массива. Недостатком такого способа организации является ограниченная длина строки. Так, если каждый элемент является байтом, то длина строки ограничена 255 символами. Именно такой способ используется в Паскале для строк типа String.
Второй способ организации – маркерный. И в этом случае строка также представляется массивом символов, но символы хранятся, начиная с первого (начального) элемента массива, а заканчивается строка специальным символом, который называется маркером. Такой способ используется в Паскале для строк типа Askiiz и в Си/Си++. Длина строки при маркерном способе организации, теоретически, не ограниченна. Пример маркерного способа организации строк в Си/Си++ уже был приведён:
char vls2[] = "2nd very long string.\n";
Третий способ организации – в виде линейного связного списка. Такой способ будет рассмотрен позже.
В языках Си/Си++ указатели на тип char могут инициализироваться с помощью строковых констант:
char *vls1 = ”1st very long string.”;
Следует отметить, что присваивание для строковых констант (и вообще строк) возможно только при инициализации. После определения символьных массивов или указателей на тип char в программе для назначения им значений следует пользоваться библиотечной функцией strcpy:
char* str;
strcpy(str,”строка”);
Строки при этом обладают всеми свойствами массивов, а указатели – это обычные «указатели на массивы», значением такого указателя является адрес начального символа строки.
Существует возможность создать массив указателей. Определение вида
int* arp[20];
создает массив указателей на объекты типа int. Элементами этого массива являются указатели на объекты типа int.
Массивы указателей можно инициализировать, например массив строк:
char* month1[ ] = {”январь”,”февраль”,”март”};
Элементами массива month1 являются адреса начальных символов строк. Возможен 2-й вариант размещения данных (в том числе строк) в памяти, при котором расход памяти больше:
char month2[ ][10] = {”январь”,”февраль”,”март”};
Одной из областей применения массивов указателей является сортировка сложных объектов неодинакового размера.