Что такое буквальный массив строк и символов в C?

Во-первых, я включил C++, поскольку C++ - это просто родительский для C, поэтому я предполагаю, что здесь применимы оба ответа, хотя язык, о котором я спрашиваю и на котором я обращаю внимание в этом вопросе, - это C, а не C++.

Так что я не так давно начал читать книгу C "Head First C". В книге (стр. 43/278) он ответит на ваш вопрос. Есть ли различия между буквальные строки и символьные массивы.

Меня это полностью потрясло, так как я не знал, что такое буквальная строка. Я понимаю, что строка - это просто массив символов, но что делает «строку» литералом? И почему он упоминает строку в C, если C на самом деле не предоставляет какой-либо класс (например, современный язык, такой как C# или Java) для строки.

Может ли кто-нибудь помочь устранить эту путаницу? Мне действительно трудно понять, что Microsoft сказала об этом здесь, и думаю, мне нужно более простое объяснение, которое я могу понять.

Строковый литерал - это литерал, который появляется в фактическом исходном коде. В отличие от того, который (например) создается за кулисами sprintf или чем-то в этом роде. Это то место, где фактическое представление находится прямо в исходном коде, чтобы все могли видеть.

mypetlion 02.05.2018 01:25

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

partikao 02.05.2018 01:26

«поскольку C++ является только родителем C» - нет, это не так.

user2100815 02.05.2018 01:26

Вы не можете сказать, что это не так, поскольку не спросили, что я имел в виду, определяя его как «родитель». (возможно, «ребенок» будет лучшим определением). Насколько я знаю, C++ - это переписанный C с расширенными функциями. Прошу прощения, если я ошибаюсь, но ответы на обоих языках будут похожими или даже точными.

partikao 02.05.2018 01:28

"вы не спросили, что я имел в виду, определяя его как" родитель "." - если бы нам пришлось это сделать, мы бы спросили, что вы имеете в виду под каждым словом в своем вопросе, что, очевидно, невозможно. Я удалил тег C++, поскольку вы конкретно говорите, что ваш вопрос касается C.

user2100815 02.05.2018 01:30

Я это понимаю. Я спишу это на плохое название и улучшу свой написание в будущих вопросах, прошу прощения.

partikao 02.05.2018 01:31

@partikao Вы правы, говоря, что C++ - это в основном надмножество C. Просто здесь, на SO, люди обычно предпочитают, когда вы спрашиваете о C или же C++, потому что в некоторых случаях ответы для C и C++ будут сильно отличаться. (Но не в этом случае.)

HolyBlackCat 02.05.2018 01:33

C++ было почти полностью надмножество, но начиная с C99 было расхождение более, не меньше.

Antti Haapala 02.05.2018 02:10

@HolyBlackCat Существует достаточная разница между C и C++, поэтому правильный ответ на вопрос OP отличается, особенно использование языка буквальный.

chux - Reinstate Monica 02.05.2018 02:35

@partikao Обратите внимание, что первые компиляторы C++ начинались как исходный код C++ -> исходный код C -> «компиляторы» кода. Итак, изначально все, что мог делать C++ (хотя и более запутанно), C мог делать, делая C++ подмножеством. С тех пор многое изменилось, включая общее разделение языков.

chux - Reinstate Monica 02.05.2018 02:43

@chux Я не знал об этой разнице, пока не увидел ваш ответ.

HolyBlackCat 02.05.2018 02:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
460
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Строковый литерал - это безымянная строковая константа в исходном коде. Например. "abc" - это строковый литерал.

Если вы сделаете что-то вроде char str[] = "abc";, вы можете сказать, что str - это инициализируется литералом. str сам по себе не буквальный, так как это не безымянный.

Строка (или, скорее, C-строка) - это непрерывная последовательность байтов, оканчивающаяся нулевым байтом.

Массив символов не обязательно является C-строкой, поскольку в нем может отсутствовать завершающий нулевой байт.

Я думаю, что понял. Буквальная строка - это просто что-то вроде function_name("literal string"). Хотя одно, что-то вроде auto literalString = "literal string" все еще было бы буквальной строкой, поскольку она на самом деле не подпадает под "константу", поскольку сама переменная literalString может быть изменена.

partikao 02.05.2018 01:30

@partikao auto literalString = "literal string" не буквальный, потому что у него есть имя. Литералы - нет.

HolyBlackCat 02.05.2018 01:31

Чтобы уточнить, "literal string" - это литерал, а literalString - нет - это указатель на const char.

user2100815 02.05.2018 04:17

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++.

HolyBlackCat 02.05.2018 02:43

Другие вопросы по теме