мета-данные страницы
  •  

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
c:c_ultimate_guide:strings [2025/10/10 10:51] – создано radi0devc:c_ultimate_guide:strings [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in
Строка 17: Строка 17:
 char message[] = {'H', 'e', 'l', 'l', 'o', '\0'}; char message[] = {'H', 'e', 'l', 'l', 'o', '\0'};
 </code> </code>
 +</note>
 +
 +===== Явное определение длинны =====
 +
 +<code c>
 +// a b c \0 - все верно
 +char abc[4] = "abc";
 +
 +// нулевой байт будет отброшен
 +char abc[3] = "abc";
 +
 +// лишнее место заполниться нулевыми байтами
 +char abc[5] = "abc";
 +
 +// поведение определено компилятором
 +// например gcc отбросит лишние символы
 +char abc[2] = "abc";
 +</code>
 +
 +===== Строка как указатель =====
 +
 +Но в языке Си также для представления строк можно использовать [[pointers|указатели]] на тип char:
 +<code c>
 +#include <stdio.h>
 +  
 +int main(void) {
 +  char *hello = "Hello METANIT.COM!";
 +  printf("%s", hello);
 +  return 0;
 +}
 +</code>
 +
 +Заданные таким образом строки __изменять нельзя__, в том числе указателями.
 +
 +В языке Си для работы со строками применяется такой механизм как //string interning// или //интернирование строк//. В этом случае строки в виде строковых литералов сохраняются в приложении в секции ''.rodata'' (read-only data), которые предназначены для данных только для чтения, а строковые литералы рассматриваются как неизменяемые данные.
 +
 +Указатель на строковой литерал содержит адрес первого бита литерала в этой секции неизменяемых данных
 +
 +<note>
 +Если два указателя с разными идентификаторами будут ссылаться на одинаковые строковые литералы - они будут ссылаться на один и тот же адрес в памяти.
 +</note>
 +
 +<note>
 +Как и любому указателю, такой строке можно задать значение NULL, но это будет не то же самое, что ''%%""%%'' тк такая строка не будет содержать нулевого байта.
 </note> </note>