Ни C, ни C ++ не имеют встроенного строкового типа данных.
Когда компилятор обнаруживает, что во время компиляции неявно ссылаются строки с двойными кавычками (см. Код ниже), сама строка сохраняется в программном коде / тексте и генерирует код длясоздать массив четных символов:
- Массив создается в статическом хранилище, потому что он должен сохраняться для последующего обращения к нему.
- Массив устанавливается в константу, поскольку он всегда должен содержать исходные данные(Привет).
Итак, наконец, у вас есть const char * к этому константному статическому массиву символов.
const char* v()
{
char* text = “Hello”;
return text;
// Above code can be reduced to:
// return “Hello”;
}
Во время выполнения программыкогда элемент управления находит открывающую скобку, он создает «текст», указатель char * в стеке и постоянный массив из 6 элементов (включая нулевой терминатор «\ 0» в конце) в области статической памяти.Когда элемент управления находит следующую строку (char * text = «Hello»;), начальный адрес массива из 6 элементов присваивается «text».В следующей строке (вернуть текст;) возвращается «текст».С закрывающей скобкой «текст» исчезнет из стека, но массив все еще находится в области статической памяти.
Вам не нужно указывать тип возврата const.Но если вы попытаетесь изменить значение в статическом массиве, используя неконстантный символ *, это все равно даст вам ошибку во время выполнения, потому что массив является постоянным.Поэтому всегда полезно сделать возвращаемую константу постоянной, чтобы убедиться, что на нее нельзя ссылаться с помощью неконстантного указателя.
Но если компилятор обнаружит, что строки с двойными кавычками явно называются массивомкомпилятор предполагает, что программист собирается (разумно) справиться с этим.Смотрите следующий неправильный пример:
const char* v()
{
char text[] = “Hello”;
return text;
}
Во время компиляции компилятор проверяет, заключает в кавычки текст и сохраняет его в том виде, в каком он есть в коде, для заполнения сгенерированного массива во время выполнения.Кроме того, он вычисляет размер массива, в данном случае снова как 6.
Во время выполнения программы с открытой скобкой в стеке создается массив «text []» с 6 элементами.Но без инициализации.Когда код находит (char text [] = «Hello»;), массив инициализируется (с текстом в скомпилированном коде).Итак, массив теперь в стеке.Когда компилятор находит (возвращает текст;), он возвращает начальный адрес массива «текст».Когда компилятор находит закрывающую скобку, массив исчезает из стека.Поэтому нет возможности ссылаться на него по указателю возврата.
Большинство стандартных функций библиотеки по-прежнему принимают только параметры char * (или const char *).
Стандартная библиотека C ++ имеет мощный класс, называемый stringдля манипулирования текстом.Внутренняя структура данных для строки - это символьные массивы.Стандартный строковый класс C ++ разработан для того, чтобы позаботиться (и скрыть) все низкоуровневые манипуляции с массивами символов, которые ранее требовались программисту на Си.Обратите внимание, что std :: string является классом:
- . Вы можете неявно преобразовать char * в std :: string, потому что последний имеет конструктор для этого.
- Вы можете явно преобразовать std :: string в const char *, используя метод c_str ().