Сравнение указателя с концом строки char

Я знаю, что при сравнении указателя char с некоторым значением char вам нужно префикс указателя *, но я нашел в некотором коде сравнение, например:

char* c;
// ... 
while (*c != ']' && *c != '\0') // search for some character 
{
    c++;
}
if (c == '\0')
{
    return -1; // error
}

Итак, мой вопрос: это ошибка или особый случай? Разве не должно быть if (*c == '\0')?

Ответ 1

Нулевые указатели

Integer константный литерал 0 имеет разные значения в зависимости от контекста, в котором он использовался. Во всех случаях она по-прежнему является целочисленной константой со значением 0, она описывается по-разному.

Если указатель сравнивается с константным литералом 0, то это проверка, чтобы увидеть, является ли указатель нулевым указателем. Затем этот 0 называется константой нулевого указателя. Стандарт C определяет, что 0, переданный в тип void *, является как нулевым указателем, так и константой нулевого указателя.

Кроме того, чтобы облегчить чтение, макрос NULL предоставляется в файле заголовка stddef.h.

Итак, вот несколько правильных способов проверки нулевого указателя:

if (pointer == NULL)

NULL определяется как сравнимый с нулевым указателем. Реализация определяется, каково фактическое определение NULL, если оно является допустимой константой нулевого указателя.

if (pointer == 0)

0 - другое представление константы нулевого указателя.

Нулевые символы

'\0' определяется как нулевой символ - это символ со всеми битами, установленными в ноль. Это не имеет никакого отношения к указателям. Однако вы можете увидеть что-то похожее на этот код:

if (!*string_pointer)

проверяет, указывает ли указатель строки нулевой символ

if (*string_pointer)

проверяет, указывает ли указатель строки на ненулевой символ.

Итак, мой вопрос: это ошибка или особый случай? Не должно ли быть (* c == '\ 0') там?

В заявлении в вашем коде if (c == '\0') проверяется, равен ли сам указатель 0. То есть он проверяет, что c является указателем Null. Но я думаю, что это ошибка, потому что оператор, проверяющий, является ли c указателем NULL, после доступа к значению, хранящемуся в c. Я думаю, что программа собирается найти символ ]. Если он обнаружил символ ] до нулевого символа, то он не возвращает -1. Итак, исправленное утверждение должно быть -

if (*c == '\0')
{
    return -1; // It didn't found the '[' character!
}

Ответ 2

Вы правы.

c == '\0'

проверяет, равен ли сам указатель 0, а не символ, на который указывает указатель.