Как ведет себя NULL (или 0 или ‘\ 0’) в массиве без знака и массиве символов? В массиве char NULL определяет конец массива char. Это тот же случай с массивом без знака? Если нет, то как мы можем определить конец массива без знака?
Точное определение NULL
определяется реализацией; все, что гарантировано, это то, что это макрос, который расширяется до константы нулевого указателя. В свою очередь, константа нулевого указателя — это «целочисленное константное выражение (5.19) типа значения целого типа, которое оценивается как ноль или значение типа типа std::nullptr_t
«Может быть, а может и не быть конвертируемым в char
или же unsigned char
; это действительно должно использоваться только с указателями.
0
является литералом типа int
имеющий значение ноль. '\0'
является литералом типа char, имеющим значение ноль. Либо неявно конвертируется в unsigned char
, производя значение ноль.
Это просто соглашение, что строка в C и C ++ часто представляется как последовательность char
с, который заканчивается на первом нулевом значении. Ничто не мешает вам объявить массив символов, который не следует этому соглашению:
char embedded_zero[] = {'a', '\0', 'b'};
Конечно, функция, которая ожидает, что ее аргумент будет следовать соглашению, остановится на первом нуле: strlen(embedded_zero) == 1;
,
Вы можете, конечно, написать функцию, которая принимает unsigned char*
и следует аналогичному соглашению, требующему, чтобы вызывающая сторона указала конец последовательности с элементом, имеющим нулевое значение. Или вы можете написать функцию, которая принимает второй параметр, указывающий длину последовательности. Вы сами решаете, какой подход лучше подходит вашему дизайну.
Строго говоря, '\0'
обозначает конец строкового литерала, а не конец любого char
массив. Например, если вы объявите массив без инициализации его строковым литералом, в нем не будет маркера конца.
Если вы инициализируете массив unsigned char
с строковым литералом, однако, вы получите то же самое '\0'
маркер конца, как в обычном массиве символов. Другими словами, в коде ниже
char s[] = "abc";
unsigned char u[] = "abc";
s[3]
а также u[3]
содержат одинаковые значения '\0'
,