Строковая константа - это последовательность из нуля или более символов, заключенных в кавычки. Кавычки не являются частью строковой константы, а служат только для ее ограничения. Строки представляются в виде массива элементов типа char. Это означает, что символы строки можно представить расположенными в соседних ячейках памяти - по одному символу в ячейке.
Но массив символов - не всегда строка!
Не следует путать символьную константу со строкой, содержащей один символ: 'Х' - это не то же самое, что "Х". В первом случае - это отдельный символ. Во втором случае - это строка, состоящая из одного символа (буквы Х) и символа конца строки '\0'.
#include <iostream>
using namespace std;
int n=5;
char line[] = "Cat!"; // Инициализация строкового массива.
void main ()
{
cout << "Word: ";
// Показ на экран строкового массива.
cout <<line;
}
В программе доступ к строке осуществляется с помощью указателя на символ. Если описать переменную message как
char *message;
то в результате выполнения оператора
message = "and bye!";
message станет указателем на строку.
#include <iostream>
using namespace std;
int main ()
{
char *message;
char privet[] = "and bye!";
char *pr = privet;
message = "Hello";
cout << " " << message << " " << pr << "\n";
int i = 0;
while (*(pr+i)!='\0')
{
cout<< *(pr+i++) << " ";
}
}
Использование указателей часто применяется при работе с массивом строк. В этом случае к каждой строке можно обратиться с помощью указателя на его первый символ. Это удобно тем, что для перестановки двух строк, расположенных в неправильном порядке, фактически достаточно переставить указатели в массиве указателей, а не сами строки.
Рассматривается функция month_name(), которая возвращает указатель на строку, содержащий имя n-го месяца. Это типичная задача для использования строкового массива.
Функция month_name() содержит локальный массив строк и при обращении к ней возвращает указатель на нужную строку.
В описании массива указателей на символы name[] инициализатором является просто список строк. Символы i-й строки помещаются в определенное место памяти, а указатель на ее начало хранится в элементе name[i]. Поскольку размер массива name не указан, компилятор сам подсчитывает количество инициализаторов и соответственно устанавливает правильное число.
#include <iostream>
using namespace std;
char *month_name(int);
int main ()
{
const int n=15;
for (int i=0; i < n; i++)
cout << "Month number " << i << " - " << month_name(i) <<"\n";
}
char *month_name (int k) /* Название k-го месяца */
{
static char *name[] = {
"none","January",
"February","March","April",
"May","June","July","August",
"September","October","November",
"December"
};
return (k<1||k>12)?name[0]:name[k];
}
Результат работы программы:
Month number 0 - none Month number 1 - January Month number 2 - February Month number 3 - March Month number 4 - April Month number 5 - May Month number 6 - June Month number 7 - July Month number 8 - August Month number 9 - September Month number 10 - October Month number 11 - November Month number 12 - December Month number 13 - none Month number 14 - none Press any key to continue