Примітка. Ця відповідь стосується мови C, а не C ++.
Нульові покажчики
Ціла константа літералу 0
має різні значення залежно від контексту, в якому вона використовується. У всіх випадках це все ще ціла константа зі значенням 0
, вона просто описана по-різному.
Якщо вказівник порівнюється з постійним літералом 0
, то це перевірка, щоб перевірити, чи є вказівник нульовим покажчиком. Потім 0
це називається константою нульового покажчика. Стандарт C визначає, що 0
передача на тип void *
є як нульовим покажчиком, так і константою нульового покажчика.
Крім того, для полегшення читабельності макрос NULL
надається у файлі заголовка stddef.h
. Залежно від вашого компілятора, можливо, можна #undef NULL
і переглянути його до чогось дурного.
Тому ось кілька дійсних способів перевірити наявність нульового вказівника:
if (pointer == NULL)
NULL
визначається для порівняння, рівного нульовому покажчику. Це реалізація визначає, що таке фактичне визначення NULL
, доки це дійсна константа нульового покажчика.
if (pointer == 0)
0
є іншим поданням константи нульового покажчика.
if (!pointer)
Це if
твердження неявно перевіряє "не 0", тому ми перевертаємо це на значення "дорівнює 0".
Нижче наведено INVALID способи перевірки нульового вказівника:
int mynull = 0;
<some code>
if (pointer == mynull)
Для компілятора це не перевірка нульового вказівника, а перевірка рівності двох змінних. Це може спрацювати, якщо mynull ніколи не змінює код і константи оптимізації компілятора, складіть 0 на оператор if, але це не гарантується, і компілятор повинен створити принаймні одне діагностичне повідомлення (попередження або помилка) відповідно до стандарту C.
Зауважте, що є нульовим покажчиком на мові С. Це не має значення для основної архітектури. Якщо основна архітектура має нульове значення вказівника, визначене як адреса 0xDEADBEEF, то сортування цього безладу залежить від компілятора.
Як такий, навіть у цій смішній архітектурі такі способи перевірки наявності нульового вказівника все ще є наступними способами:
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
Нижче наведено INVALID способи перевірки нульового вказівника:
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
оскільки компілятор розглядає їх як звичайні порівняння.
Нульові символи
'\0'
визначається як нульовий символ - тобто символ з усіма бітами, встановленими в нуль. Це не має нічого спільного з покажчиками. Однак ви можете побачити щось подібне до цього коду:
if (!*string_pointer)
перевіряє, чи вказує рядок на нульовий символ
if (*string_pointer)
перевіряє, чи вказівник рядка вказує на ненульовий символ
Не плутайте їх з нульовими вказівниками. Тільки тому, що представлення бітів однакове, і це дозволяє зробити зручні перехресні випадки, вони насправді не те саме.
Крім того, '\0'
це (як і всі літерали символів) ціла константа, у цьому випадку зі значенням нуль. Таким чином , '\0'
повністю еквівалентний неукрашенним 0
целочисленная константа - єдина відмінність полягає в намірі , що він передає до людського читачеві ( «Я використовую це як нульовий символ.»).
Список літератури
Див Питання 5.3 comp.lang.c FAQ для більш. Дивіться цей pdf для стандарту C. Перегляньте розділи 6.3.2.3 Покажчики, параграф 3.