Во-первых, я включил C++, поскольку C++ - это просто родительский для C, поэтому я предполагаю, что здесь применимы оба ответа, хотя язык, о котором я спрашиваю и на котором я обращаю внимание в этом вопросе, - это C, а не C++.
Так что я не так давно начал читать книгу C "Head First C". В книге (стр. 43/278) он ответит на ваш вопрос. Есть ли различия между буквальные строки и символьные массивы.
Меня это полностью потрясло, так как я не знал, что такое буквальная строка. Я понимаю, что строка - это просто массив символов, но что делает «строку» литералом? И почему он упоминает строку в C, если C на самом деле не предоставляет какой-либо класс (например, современный язык, такой как C# или Java) для строки.
Может ли кто-нибудь помочь устранить эту путаницу? Мне действительно трудно понять, что Microsoft сказала об этом здесь, и думаю, мне нужно более простое объяснение, которое я могу понять.
Я думаю, что на других языках это называлось «жестко закодированной строкой»? Если я прав, то я это понимаю.
«поскольку C++ является только родителем C» - нет, это не так.
Вы не можете сказать, что это не так, поскольку не спросили, что я имел в виду, определяя его как «родитель». (возможно, «ребенок» будет лучшим определением). Насколько я знаю, C++ - это переписанный C с расширенными функциями. Прошу прощения, если я ошибаюсь, но ответы на обоих языках будут похожими или даже точными.
"вы не спросили, что я имел в виду, определяя его как" родитель "." - если бы нам пришлось это сделать, мы бы спросили, что вы имеете в виду под каждым словом в своем вопросе, что, очевидно, невозможно. Я удалил тег C++, поскольку вы конкретно говорите, что ваш вопрос касается C.
Я это понимаю. Я спишу это на плохое название и улучшу свой написание в будущих вопросах, прошу прощения.
@partikao Вы правы, говоря, что C++ - это в основном надмножество C. Просто здесь, на SO, люди обычно предпочитают, когда вы спрашиваете о C или же C++, потому что в некоторых случаях ответы для C и C++ будут сильно отличаться. (Но не в этом случае.)
C++ было почти полностью надмножество, но начиная с C99 было расхождение более, не меньше.
@HolyBlackCat Существует достаточная разница между C и C++, поэтому правильный ответ на вопрос OP отличается, особенно использование языка буквальный.
@partikao Обратите внимание, что первые компиляторы C++ начинались как исходный код C++ -> исходный код C -> «компиляторы» кода. Итак, изначально все, что мог делать C++ (хотя и более запутанно), C мог делать, делая C++ подмножеством. С тех пор многое изменилось, включая общее разделение языков.
@chux Я не знал об этой разнице, пока не увидел ваш ответ.
Строковый литерал - это безымянная строковая константа в исходном коде. Например. "abc"
- это строковый литерал.
Если вы сделаете что-то вроде char str[] = "abc";
, вы можете сказать, что str
- это инициализируется литералом. str
сам по себе не буквальный, так как это не безымянный.
Строка (или, скорее, C-строка) - это непрерывная последовательность байтов, оканчивающаяся нулевым байтом.
Массив символов не обязательно является C-строкой, поскольку в нем может отсутствовать завершающий нулевой байт.
Я думаю, что понял. Буквальная строка - это просто что-то вроде function_name("literal string")
. Хотя одно, что-то вроде auto literalString = "literal string"
все еще было бы буквальной строкой, поскольку она на самом деле не подпадает под "константу", поскольку сама переменная literalString
может быть изменена.
@partikao auto literalString = "literal string"
не буквальный, потому что у него есть имя. Литералы - нет.
Чтобы уточнить, "literal string"
- это литерал, а literalString
- нет - это указатель на const char.
What is a literal string & char array in C?
C имеет 2 вида литералы: строковые литералы и составные литералы. Оба безымянны, и у обоих могут быть заняты адреса. строковые литералы может содержать более 1 нулевой символ.
В библиотеке C нить - это символы до первого нулевой символ включительно. Таким образом, нить всегда имеет один и только один нулевой символ, иначе это не нить. нить может быть char
, signed char
, unsigned char
.
// v---v string literal 6 char long
char *s1 = "hello";
char *s2 = "hello\0world";
// ^----------^ string literal 12 char long
char **s3 = &"hello"; // valid
// v------------v compound literal
int *p1 = (int []){2, 4};
int **p2 = &(int []){2, 4}; // vlaid
C определяет следующие константы, а не литералы, например 123
, 'x'
и 456.7
. Эти константы не могут получить свой адрес.
int *p3 = &7; // not valid
C++ и C различаются по многим из этих аспектов.
Массив char
- это множествоchar
. Массив может состоять из множества нулевые символы.
char a1[3]; // `a1` is a char array size 3
char a2[3] = "123"; // `a2` is a char array size 3 with 0 null characters
char a3[4] = "456"; // `a3` is a char array size 4
char a4[] = "789"; // `a4` is a char array size 4
char a5[4] = { 0 }; // `a5` is a char array size 4, all null characters
Следующие t*
представляют собой массивы нетchar
, но указывают на char
.
char *t1;
char *t2 = "123";
int *t3 = (char){'x'};
Туш, я не знал об этой разнице в именах между C и C++.
Строковый литерал - это литерал, который появляется в фактическом исходном коде. В отличие от того, который (например) создается за кулисами
sprintf
или чем-то в этом роде. Это то место, где фактическое представление находится прямо в исходном коде, чтобы все могли видеть.