указатели — Значение NULL (или 0 или ‘\ 0’) интерпретируется по-разному в массиве без знака и массиве символа в c ++?

Как ведет себя NULL (или 0 или ‘\ 0’) в массиве без знака и массиве символов? В массиве char NULL определяет конец массива char. Это тот же случай с массивом без знака? Если нет, то как мы можем определить конец массива без знака?

2

Решение

Точное определение 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* и следует аналогичному соглашению, требующему, чтобы вызывающая сторона указала конец последовательности с элементом, имеющим нулевое значение. Или вы можете написать функцию, которая принимает второй параметр, указывающий длину последовательности. Вы сами решаете, какой подход лучше подходит вашему дизайну.

3

Другие решения

Строго говоря, '\0' обозначает конец строкового литерала, а не конец любого char массив. Например, если вы объявите массив без инициализации его строковым литералом, в нем не будет маркера конца.

Если вы инициализируете массив unsigned charс строковым литералом, однако, вы получите то же самое '\0' маркер конца, как в обычном массиве символов. Другими словами, в коде ниже

char s[] = "abc";
unsigned char u[] = "abc";

s[3] а также u[3] содержат одинаковые значения '\0',

2

По вопросам рекламы [email protected]