Страницы

Поиск по вопросам

понедельник, 3 февраля 2020 г.

Пустой строковый литерал

#cpp


Какое внутреннее представление имеют литералы вида const char A[]="" и const char* B="" ?
    


Ответы

Ответ 1



В этих двух определениях const char A[]=""; const char* B=""; строковый литерал - это выражение, используемое в правой части от знака =, то есть это "". Строковый литерал - это последовательность символов, завершаемая нулем. Поэтому внутренне строковый литерал "" имеет представление как { '\0' } то есть содержит один символ '\0' В первом объявлении объявляется массив, который инициализируется этим литералом, то есть элементы массива инициализируются элементами строкового литерала. Так как в данном случае строковый литерал имеет всего лишь один элемент, и размерность массива явно не задана, то размерность массива будет определяться по количеству инициализаторов, то есть по количеству элементов строкового литерала. Следовательно массив A имеет тип conct char [1] и содержит единственный элемент со значением '\0'. Во втором случае объявляется указатель на строковый литерал, который получает адрес первого символа (то есть символа '\0', так как это единственный символ строкового литерала). То есть в конечном итоге в первом случае объявляется константный символьный массив из одного элемента инициализируемого нулем, а во втором случае объявляется указатель на константный объект типа const char , который инициализируется адресом строкового литерала "", то есть его первого и единственного символа, который расположен в статической области памяти. Если вы выполните следующую программу #include int main() { std::wcout << sizeof( "" ) << std::endl; } то ее вывод на консоль будет равен 1. То есть "пустой" строковый литерал содержит один элемент равный '\0'. В C++ строковые литералы имеют тип константных символьных массивов. Например, строковый литерал "Hello" имеет тип const char[6]. При использовании строковых литералов в выражениях за редким исключением таким, как, например, при использовании в операторе sizeof, строковые литералы неявно преобразуются в указатели на свои первые элементы.

Ответ 2



Строковые литералы - это массивы с нулевым элементом на конце. По этому представление "" - это массив из одного элемента, который равен '\0'. const char __empty[1] = {'\0'}; При этом отличие переменных A и B в том, что у A тип const char[1], как и у литерала, которым он инициализируется, а B - это указатель с типом const char* (который указывает на массив char[1]).

Комментариев нет:

Отправить комментарий