Я понимаю, что если вы храните строку (или в C, более известный как
массив символов) это на самом деле просто адрес в памяти первого
элемент этого массива.
[узкий] строковый литерал имеет тип char[C]
, где C == 1+strlen(s)
(1 для '\0'
в конце, который функция strlen
исключает из возвращаемого значения).
Если вы храните строковый литерал в переменной типа char*
, то это действительно так, как вы говорите: просто адрес в памяти первого элемента этого массива. Вот как работает «распад массива».
Если, однако, вы храните строковый литерал в переменной типа char[N]
, то как все будет работать, зависит от N
и 1+strlen(S)
(где S
будет строковым литералом). Если N < 1+strlen(S)
, то в массиве char
сохраняются только первые символы N
, и массив не заканчивается на '\0'
. Если N >= 1+strlen(S)
, то все символы S
сохраняются в массиве char
, а любые элементы, превышающие 1+strlen(S)
, инициализируются нулями, как обычно для массивов.
Как этот первый элемент массива знает, сколько он должен считать
для всего массива я догадываюсь, что он останавливается при первом появлении
\0
но я прав? Я Бен сказал \0
это признак того, что массив
закончил, что вы нажали последний элемент (или технически, 1 после
последний элемент).
Первый элемент не хранит счетчик массива, пока вы не сделаете это таким образом. В случае сохранения строкового литерала или любого другого массива char
в объекте типа char*
, вы отбрасываете информацию о размере, если вы не сохранили размер в первом элементе вручную (строки в языке программирования Pascal делают этот). Независимо от того, сохранили ли вы размер, вы все равно отвечаете за отслеживание информации о размере. Если вы инициализируете объект типа char[N]
строковым литералом, вы сохраняете информацию о размере массива, и компилятор отслеживает все символы N
в течение всего времени жизни массива.