zerowa Wskaźniki
stałej całkowitej dosłownym 0 ma inne znaczenie w zależności od kontekstu, w którym jest on używany. We wszystkich przypadkach jest to stała liczbowa o wartości 0, opisana jest tylko na różne sposoby.
Jeśli wskaźnik jest porównywany ze stałym literałem 0, to sprawdza, czy wskaźnik jest wskaźnikiem pustym. To 0 jest następnie określane jako stała wskaźnika zerowego. Standard C definiuje, że 0 rzutowanie na typ void * jest zarówno wskaźnikiem zerowym, jak i stałą wskaźnika pustego.
Dodatkowo, aby ułatwić czytelność, w pliku nagłówkowym stddef.h
podano makro NULL.
Dlatego oto kilka ważnych sposobów, aby sprawdzić, null pointer:
if (pointer == NULL)
NULL
definiuje porównać równa null pointer. Jest to implementacja zdefiniowana, jaka jest rzeczywista definicja wartości NULL, o ile jest to poprawna zerowa stała wskaźnika.
if (pointer == 0)
0 jest inna reprezentacja zerowej stałym wskaźnikiem.
Null Postacie
'\0'
definiuje się znak null - że to postać z wszystkimi bitami ustawionymi na zero. To nie ma nic wspólnego ze wskaźnikami. Jednakże można zobaczyć coś podobnego do tego kodu:
if (!*string_pointer)
kontroli jeśli wskaźnik ciąg jest wskazując na znak null
if (*string_pointer)
kontrole, jeśli wskaźnik ciąg jest wskazujące na nie- pusty znak.
Moje pytanie brzmi: czy to błąd, czy specjalny przypadek? Czy nie powinno tam być (* c == '\ 0')?
Instrukcja w kodzie if (c == '\0')
sprawdza, czy wskaźnik jest równy 0. Oznacza to, że sprawdza, czy c jest wskaźnikiem zerowym. Ale myślę, że to błąd, ponieważ instrukcja, aby sprawdzić, czy c jest wskaźnikiem NULL
jest po uzyskaniu dostępu do wartości przechowywanej w c. Myślę, że program ma zamiar zlokalizować postać ]
. Jeśli znajdzie znak ]
przed znakiem pustym, to nie zwróci -1. Więc skorygowana deklaracja powinna być-
if (*c == '\0')
{
return -1; // It didn't found the '[' character!
}
zły sposób sprawdzania NULL. –
Tak, dereferencje w tym przypadku wydają się logiczną rzeczą, więc najprawdopodobniej jest to błąd. –
To błąd. To skutecznie sprawdza 'c' dla NULL, co powinno być zrobione w' // ... 'w pierwszej kolejności. Autor prawdopodobnie miał na myśli 'if (* c == '\ 0')', aby sprawdzić, czy pętla wylądowała na terminatorze w stosunku do '']''. – WhozCraig