Как символ a и строка a хранятся иначе, чем нулевое завершение в c? - PullRequest
0 голосов
/ 07 октября 2019

Я наткнулся на эту строку из книги, которую она написала, когда мы храним «а» как строку, которая хранится как символьная константа, за которой следует нулевой символ, и указатель указывает на него. Но когда мы сохраняем символ «а», он сохраняется как целое число в памяти. Не является ли строка также сохраняется как соответствующее целое число только для завершения нулевым символом.

1 Ответ

0 голосов
/ 07 октября 2019

Строка - это последовательность символьных значений, включая терминатор с 0 значениями - строка "hello" представлена ​​последовательностью символов {'h', 'e', 'l', 'l', 'o', 0}.

Каждый отдельный символ представлен в виде небольшого целого числа, котороесохраняет кодировку для этого символа (ASCII, EBCDIC, UTF-8 или некоторую другую кодировку). Кодировка ASCII для вышеуказанной последовательности будет {104, 101, 108, 108, 111, 0}.

. Строки хранятся в массивах символьного типа (char для ASCII, EBCDIC и UTF-8, wchar_t для «широких» кодировок символовкак UTF-16). Это включает строковые литералы, которые хранятся таким образом, чтобы они были видны во всей программе.

За исключением случаев, когда это операнд операторов sizeof или унарный & или строковый литерал, используемый для инициализациимассив символов в объявлении, выражение типа «массив N-элементов из T» преобразуется («распадается») в тип «указатель на T» и значение выраженияэто адрес первого элемента массива. Вот почему вы видите char * так часто при работе со строками - это следствие того, как C обрабатывает выражения массива.

Большинство функций библиотек строк и ввода-вывода принимают аргумент char *, который указывает на первыйсимвол в строке (то есть первый элемент массива, в котором хранится строка). Эти функции будут обрабатывать эти строки, «прогуливаясь» по массиву, пока не увидят этот терминатор 0. Поскольку все, что передается в функцию, это адрес первого элемента, функция не имеет представления о том, насколько велик массив, хранящий функцию. Он зависит от присутствия этого 0-терминатора, чтобы знать, когда прекратить обработку. Вот почему такие операции, как strcpy, могут быть опасными - если вы попытаетесь скопировать 20-символьную строку в массив размером всего 10 символов, эти дополнительные 10 символов будут записаны в память после массива, что приведет к непредсказуемым последствиям. .

...