Ответ полностью зависит от языка, о котором идет речь. Но C, как правило, хороший язык для того, чтобы увидеть, как что-то происходит за кулисами.
В С:
В C строки являются массивом char
с 0 в конце:
char str[1024];
strcpy(str, "hello ");
strcpy(str, "world!");
За кулисами str [0] == 'h' (значение int), str [1] == 'e', ...
str [11] == '!', str [12] == '\ 0';
Символ - это просто число, которое может содержать одно из 256 значений. Каждый символ имеет числовое значение.
В C ++:
Строки
поддерживаются так же, как C, но у вас также есть тип string
, который является частью STL.
строковые литералы являются частью статического хранилища и не могут быть изменены напрямую, если вы не хотите неопределенного поведения.
Это зависит от реализации, как строковый тип на самом деле работает за кулисами, но сами строковые объекты являются изменяемыми.
В C #:
строки являются неизменяемыми. Это означает, что вы не можете напрямую изменить строку после ее создания. Когда вы делаете + =, что происходит, если создается новая строка, и ваша строка теперь ссылается на эту новую строку.