La risposta dipende dalla lingua che stai utilizzando.
C / C ++
In C e C ++, la parola chiave era NULL e ciò che NULL era realmente era 0. Si decise che "0x0000" non sarebbe mai stato un puntatore valido per un oggetto, e quindi questo è il valore che viene assegnato a indica che non è un puntatore valido. Tuttavia, è completamente arbitrario. Se si è tentato di accedervi come un puntatore, si comporterebbe esattamente come un puntatore a un oggetto che non esiste più in memoria, causando un'eccezione di puntatore non valida. Il puntatore stesso occupa la memoria, ma non più di un oggetto intero. Quindi, se hai 1000 puntatori nulli, è l'equivalente di 1000 numeri interi. Se alcuni di questi puntatori puntano a oggetti validi, l'utilizzo della memoria sarebbe l'equivalente di 1000 numeri interi più la memoria contenuta in quei puntatori validi. Ricorda che in C o C ++, se un puntatore non punta più al suo oggetto, che non implica che la memoria è stata rilasciata, quindi devi eliminare esplicitamente quell'oggetto usando dealloc (C) o delete (C ++) .
Java
Diversamente da C e C ++, in Java null è semplicemente una parola chiave. Piuttosto che gestire null come un puntatore a un oggetto, è gestito internamente e trattato come un letterale. Ciò ha eliminato la necessità di collegare i puntatori come tipi interi e consente a Java di astrarre completamente i puntatori. Tuttavia, anche se Java lo nasconde meglio, sono ancora puntatori, ovvero 1000 puntatori nulli consumano ancora l'equivalente di 1000 interi. Ovviamente quando puntano agli oggetti, proprio come C e C ++, la memoria viene consumata da quegli oggetti fino a quando non vi sono più puntatori che li fanno riferimento, tuttavia diversamente da C e C ++, il garbage collector preleva su di esso al passaggio successivo e libera la memoria, senza che sia necessario tenere traccia di quali oggetti sono stati liberati e quali non sono, nella maggior parte dei casi (a meno che non si abbiano motivi per fare riferimento ad oggetti debolmente, ad esempio).