Nota: questa risposta si applica al linguaggio C, non a C ++.
Puntatori null
La costante intera letterale 0
ha significati diversi a seconda del contesto in cui viene utilizzata. In tutti i casi, è ancora una costante intera con il valore 0
, è appena descritta in diversi modi.
Se un puntatore viene confrontato con il costante letterale 0
, questo è un controllo per vedere se il puntatore è un puntatore nullo. Questa 0
viene quindi definita costante del puntatore null. Lo standard C definisce che il 0
cast per il tipo void *
è sia un puntatore null che una costante puntatore null.
Inoltre, per facilitare la leggibilità, la macro NULL
viene fornita nel file di intestazione stddef.h
. A seconda del compilatore, potrebbe essere possibile #undef NULL
e ridefinirlo in qualcosa di strano.
Pertanto, ecco alcuni modi validi per verificare la presenza di un puntatore null:
if (pointer == NULL)
NULL
è definito per confrontare uguale a un puntatore nullo. È l'implementazione definita quale sia la definizione effettiva NULL
, purché sia una costante puntatore null valida.
if (pointer == 0)
0
è un'altra rappresentazione della costante puntatore null.
if (!pointer)
Questa if
affermazione controlla implicitamente "non è 0", quindi invertiamo che significa "è 0".
Di seguito sono riportati i metodi NON VALIDI per verificare la presenza di un puntatore null:
int mynull = 0;
<some code>
if (pointer == mynull)
Per il compilatore questo non è un controllo per un puntatore nullo, ma un controllo di uguaglianza su due variabili. Questo potrebbe funzionare se mynull non cambia mai nel codice e le ottimizzazioni del compilatore costano lo 0 nell'istruzione if, ma ciò non è garantito e il compilatore deve produrre almeno un messaggio diagnostico (avviso o errore) secondo lo standard C.
Si noti che cos'è un puntatore null nel linguaggio C. Non importa sull'architettura sottostante. Se l'architettura sottostante ha un valore di puntatore nullo definito come indirizzo 0xDEADBEEF, spetta al compilatore ordinare questo pasticcio.
Pertanto, anche su questa architettura divertente, i seguenti modi sono ancora validi per verificare la presenza di un puntatore null:
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
Di seguito sono riportati i metodi NON VALIDI per verificare la presenza di un puntatore null:
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
poiché questi sono visti da un compilatore come normali confronti.
Personaggi Null
'\0'
è definito come un carattere nullo, ovvero un carattere con tutti i bit impostati su zero. Questo non ha nulla a che fare con i puntatori. Tuttavia potresti vedere qualcosa di simile a questo codice:
if (!*string_pointer)
controlla se il puntatore di stringa punta a un carattere null
if (*string_pointer)
controlla se il puntatore di stringa punta a un carattere non nullo
Non confonderli con puntatori null. Solo perché la rappresentazione dei bit è la stessa, e questo consente alcuni comodi casi incrociati, non sono proprio la stessa cosa.
Inoltre, '\0'
è (come tutti i letterali dei caratteri) una costante intera, in questo caso con il valore zero. Quindi '\0'
è completamente equivalente a una 0
costante intera senza ornamenti - l'unica differenza è nell'intento che trasmette a un lettore umano ("Sto usando questo come carattere nullo").
Riferimenti
Vedi la domanda 5.3 delle FAQ di comp.lang.c per ulteriori informazioni. Vedi questo pdf per lo standard C. Consulta le sezioni 6.3.2.3 Puntatori, paragrafo 3.