( Si prega di leggere questo paragrafo prima di leggere il post. Chiedo a chiunque sia interessato a leggere questo post di provare a leggerlo attentamente e, naturalmente, di non votarlo meno finché non lo capisci completamente, grazie.)
Ora è un wiki della comunità, in quanto tale se qualcuno non è d'accordo con uno qualsiasi dei concetti, per favore modificalo, con una spiegazione chiara e dettagliata di cosa è sbagliato e perché, e se possibile per favore cita fonti o fornisci prove che possono essere riprodotte.
Risposta
Ecco alcuni altri motivi che potrebbero essere i fattori alla base di NULL == 0
- Il fatto che zero sia falso, quindi si può fare direttamente
if(!my_ptr)
invece di if(my_ptr==NULL)
.
- Il fatto che gli interi globali non iniziati siano inizializzati per impostazione predefinita su tutti zeri, e come tale un puntatore di tutti zeri sarebbe considerato non inizializzato.
Qui vorrei dire una parola su altre risposte
Non a causa dello zucchero sintattico
Dire che NULL è zero a causa dello zucchero sintattico, non ha molto senso, in tal caso perché non utilizzare l'indice 0 di un array per mantenerne la lunghezza?
In effetti C è il linguaggio che più somiglia all'implementazione interna, ha senso dire che C ha scelto zero solo a causa dello zucchero sintattico? Preferirebbero fornire una parola chiave null (come fanno molti altri linguaggi) piuttosto che mappare zero su NULL!
In quanto tale, mentre ad oggi potrebbe essere solo zucchero sintattico, è chiaro che l'intenzione originale degli sviluppatori del linguaggio C non era per lo zucchero sintattico, come mostrerò più avanti.
1) La specifica
Tuttavia, sebbene sia vero che la specifica C parla dalla costante 0 come puntatore nullo (sezione 6.3.2.3), e definisce anche NULL da definire come implementazione (sezione 7.19 nella specifica C11 e 7.17 nella specifica C99), la Resta il fatto che nel libro "The C Programming Language" scritto dagli inventori di C nella sezione 5.4 si afferma quanto segue:
C garantisce che zero non sia mai un indirizzo valido per i dati, quindi un valore di ritorno pari a zero può essere utilizzato per segnalare un evento anormale, in questo caso, senza spazio.
Puntatore e numeri interi non sono intercambiabili, Zero è l'unica eccezione: la costante zero può essere assegnata a un puntatore e un puntatore può essere confrontato con la costante zero. La costante simbolica NULL è spesso usata al posto di zero, come mnemonico per indicare più chiaramente che questo è un valore speciale per un puntatore. NULL è definito in. D'ora in poi useremo NULL.
Come si può vedere (dalle parole "indirizzo zero") almeno l'intenzione originaria degli autori di C era dell'indirizzo zero, e non della costante zero, inoltre da questo estratto risulta che il motivo per cui la specifica parla dal la costante zero probabilmente non serve per escludere un'espressione che restituisce zero, ma piuttosto per includere la costante intera zero come l'unica costante intera consentita per l'uso in un contesto di puntatore senza casting.
2) Riepilogo
Sebbene la specifica non dica esplicitamente che un indirizzo zero può essere trattato in modo diverso dalla costante zero, non lo dice, e il fatto che quando si tratta della costante del puntatore nullo non pretenda che sia un'implementazione definita come essa fa dalla costante definita NULL , invece affermare che sia zero, mostra che potrebbe esserci una differenza tra la costante zero e l'indirizzo zero.
(Tuttavia, se questo è il caso, mi chiedo solo perché NULL sia definita l'implementazione, poiché in tal caso NULL può anche essere la costante zero, poiché il compilatore deve comunque convertire tutte le costanti zero nell'attuale implementazione definita NULL?)
Tuttavia non lo vedo in azione reale e nelle piattaforme generali l'indirizzo zero e la costante zero sono trattati allo stesso modo e lanciano lo stesso messaggio di errore.
Inoltre il fatto è che i sistemi operativi odierni stanno effettivamente riservando l'intera prima pagina (range da 0x0000 a 0xFFFF), solo per impedire l'accesso all'indirizzo zero a causa del puntatore NULL di C, (vedi http://en.wikipedia.org/wiki/ Zero_page , così come "Windows tramite C / C ++ di Jeffrey Richter e Christophe Nasarre (pubblicato da Microsoft Press)").
Quindi chiederei a chiunque affermi di averlo effettivamente visto in azione, di specificare la piattaforma e il compilatore e il codice esatto che ha effettivamente fatto, (sebbene a causa della vaga definizione nelle specifiche [come ho mostrato] qualsiasi compilatore e la piattaforma è libera di fare quello che vuole).
Tuttavia sembra che gli autori di C non lo avessero in mente, e stessero parlando dell '"indirizzo zero", e che "C garantisce che non sia mai un indirizzo valido", così come "NULL è solo un mnemonico ", mostrando chiaramente che l'intenzione originale non era per" zucchero sintattico ".
Non a causa del sistema operativo
Affermando inoltre che il sistema operativo nega l'accesso all'indirizzo zero, per alcuni motivi:
1) Quando è stato scritto C non c'era alcuna restrizione di questo tipo, come si può vedere su questo wikipage http://en.wikipedia.org/wiki/Zero_page .
2) Il fatto è che i compilatori C hanno avuto accesso all'indirizzo di memoria zero.
Questo sembra essere il fatto dal seguente articolo di BellLabs ( http://www.cs.bell-labs.com/who/dmr/primevalC.html )
I due compilatori differiscono nei dettagli nel modo in cui affrontano questo problema. Nella prima, l'inizio si trova nominando una funzione; in seguito, l'inizio è semplicemente considerato 0. Ciò indica che il primo compilatore è stato scritto prima che avessimo una macchina con mappatura della memoria, quindi l'origine del programma non era nella posizione 0, mentre al momento del secondo, avevamo un PDP-11 che forniva la mappatura.
(In effetti ad oggi (come ho citato sopra i riferimenti da wikipedia e microsoft press), il motivo per limitare l'accesso all'indirizzo zero è a causa dei puntatori NULL di C! Quindi alla fine risulta essere il contrario!)
3) Ricorda che C è anche usato per scrivere sistemi operativi e persino compilatori C!
In effetti C è stato sviluppato allo scopo di scrivere il sistema operativo UNIX con esso, e come tale non sembra essere una ragione per cui dovrebbero limitarsi dall'indirizzo zero.
Spiegazione (hardware) su come i computer sono (fisicamente) in grado di accedere all'indirizzo zero
C'è un altro punto che voglio spiegare qui, come è possibile fare riferimento all'indirizzo zero?
Pensaci per un secondo, gli indirizzi vengono recuperati dal processore e quindi inviati come tensioni sul bus di memoria, che viene quindi utilizzato dal sistema di memoria per raggiungere l'indirizzo effettivo, e tuttavia un indirizzo pari a zero significherà assenza di tensione , allora in che modo l'hardware fisico del sistema di memoria accede all'indirizzo zero?
La risposta sembra essere che l'indirizzo zero è l'impostazione predefinita, e in altre parole l'indirizzo zero è sempre accessibile dal sistema di memoria quando il bus di memoria è completamente spento, e come tale qualsiasi richiesta di lettura o scrittura senza specificare un indirizzo effettivo (che è il caso con indirizzo zero) accede automaticamente all'indirizzo zero.
if (p != 0)
aif (p)
quale è un idioma comune in C e C ++, anche se dovrai uscire dall'abitudine se prendi Java.