Почему char занимает 1 байт, а строка с одним символом — 2 байта?
===================================================================

 Слышал что-то про добавление в конце строк " \0 ", но не вдавался в подробности. Кто знает, ответьте пожалуйста! 

 Все правильно, этот 1 байт занимает символ конца строки '\0' 

 Существует 2 типа строк:  
  

Типа С.  

Тип Паскаль.  
  

К языкам это не имеет отношения: язык Паскаль может использовать строки типа С, язык С может использовать строки типа Паскаль. Название просто исторически возникло, т.к. изначально в С и Паскале были только одного вида строки (разные, такие как описано ниже).  
  

Строка типа С - это массив байтов, заканчивающийся нулем. То есть строка не может содержать символ с кодом 0 (не числом 0, а символ с кодом 0, нулевой байт). Длина строки всегда = количество символов + 1 байт (с нулевым кодом) в конце строки.  
  

Строка типа Паскаль в начале хранит 1 байт, указывающий длину строки, затем идет массив символов. Строка может содержать внутри себя символы с кодом 0. Но не может быть длиннее 255 байт. В памяти такая строка занимает те же что и С = число символов в строке + 1 байт в начале, хранящий её длину.  
  

А еще есть строки UNICODE, UTF8, строки типа Паскаль, где длина указана 2-мя байтами (т.е. максимальная длина 65535 символов в строке).  
  

Длина таких строк в байтах может быть очень и очень разной. Совсем не соответствующей числу символов. Разница будет не на 1 байт (как в простых строках типа С и типа Паскаль). Более того, например, в UTF8 длина строки в байтах будет зависеть от того, что именно написано. )))  
  

В наше время я настоятельно рекомендую изучать не простые char, а обратить внимание именно на UNICODE.  

А там вовсе не один байт на один символ. ))))) 

 Нуль-символ обозначает конец строки. То есть строку можно читать, посимвольно смещаясь вправо, пока не встретится конец. Таким образом её длину хранить не нужно.  

А теперь представь строку на миллиард символов. Для такой строки затраты на хранение её длины остаются теми же - один байт в котором записан нуль-символ.  

А вот если бы длина строки хранилась в переменной, то нужно было бы следить за размером этой переменной, потому что на слишком длинных строках числовое значение длины не помещалось бы в переменную.  

Ты думаешь, почему Дельфи такой медленный язык (программа The Bat! работает медленно), потому что там этого нет, из-за чего происходит множество лишних вычислений. 

 одна буква может иметь тип char или w\_char  
`char` - одна буква в кодировке ASCII занимает один байт  
`w_char` - одна буква в кодировке UTF-16, занимает 2 байта  
`\0` - символ конца строки, используется для того чтобы printf и т.п. функции знали где заканчивается область памяти отведенная под строку.  
  
`const char *name = "name";` - символ конца строки поставит сам компилятор и длина строки будет не 4 байта, а 5, но при этом strlen должен возвращать длину до \0 т.е. 4 байта, хотя на самом деле хранится 5 байт  
  

Примерно так. Другими словами если нужна строка, то нужно делать на 1 байт больше.  

В этом плане проще использовать С++ `std::string`, `std::wstring` или `Qstring` 

 char - это 1 символ  

string - это строка + её длина