28.01.2007, 10:21
общий
это ответ
Здравствуйте, Platon!
Вы, как и многие из начинающих С++ программистов столкнулись со сложность реализации строк. Видете ли строка в С++ это указатель по сути дела на первый символ этой сторки. Вообще говоря это массив символов по сути дела. Рассмотрим пример.
int *p = new int[3];
Обращаться к элементу можно так: p[index] или так *(p + index)
Как мы видим здесь оператор new выделяет три свободных подряд идущих ячеек и возвращает указатель на первую из них. На самом деле в С++ char - это не символ, это целочисленный тип, отличающийся только своим границами - 0..255, и если мы сделаем
char *p = new char[3];
То тоже будет массив целых чисел. Строка в С++ это массив целых чисел, последним элементом которго является символ ‘\0‘ (если мы пишем в апострофах, то это символ), его значение в виде целого числа 0 и называется он символ конца строки.
Вот пример:
char *s = new char[3];
s[0] = ‘a‘;
s[1] = ‘b‘;
s[2] = ‘\0‘;
Так мы получили строку "ab".
Тогоже самого можно добиться написав char *s = "ab"; НО здесь разница в том, что элементы этой строки изменять нельзя. Надо помнить что s - это указатель на первый символ. Используя операцию разименовывания вы сами можете в этом убедиться. Т.е.:
char *s = "ab";
char f = *s;
Значение f в этом случае будет равно ‘a‘.
Вернемся к Вашему примеру. У Вас действительно массив указателей и каждый из указателей указывает на первый символ строки.
array[0] - это указатель на первый символ строки "a" т.е. указатель на первую ячейку массива ‘a‘ ‘\0‘ из двух элементов. Если вы передадите этот указатель какой либо функции для работы со строками, то она считывает строку следующим образом: берет указатель array[0], разименовывает, и получает значение первого символа: *array[0]. Далее берется следующий символ: *(array[0] + 1) и так далее пока некоторое значенеи *(array[0] + index) не станет равным ‘\0‘, т.е. встретиться конец строки.