A resposta depende do idioma que você está usando.
C / C ++
Em C e C ++, a palavra-chave era NULL, e o que realmente era NULL era 0. Foi decidido que "0x0000" nunca seria um ponteiro válido para um objeto, e esse é o valor que é atribuído para indicar que ele é. não é um ponteiro válido. No entanto, é completamente arbitrário. Se você tentasse acessá-lo como um ponteiro, ele se comportaria exatamente como um ponteiro para um objeto que não existe mais na memória, causando uma exceção de ponteiro inválida. O ponteiro em si ocupa memória, mas não mais do que um objeto inteiro. Portanto, se você tiver 1000 ponteiros nulos, será equivalente a 1000 números inteiros. Se alguns desses ponteiros apontarem para objetos válidos, o uso da memória seria equivalente a 1000 números inteiros mais a memória contida nesses ponteiros válidos. Lembre-se de que em C ou C ++,não implica que a memória foi liberada, portanto, você deve excluir explicitamente esse objeto usando dealloc (C) ou delete (C ++).
Java
Diferentemente de C e C ++, em Java nulo é apenas uma palavra-chave. Em vez de gerenciar nulo como um ponteiro para um objeto, ele é gerenciado internamente e tratado como um literal. Isso eliminou a necessidade de vincular ponteiros como tipos inteiros e permite que o Java abstraia completamente os ponteiros. No entanto, mesmo que o Java oculte melhor, eles ainda são ponteiros, o que significa que 1000 ponteiros nulos ainda consomem o equivalente a 1000 números inteiros. Obviamente, quando apontam para objetos, como C e C ++, a memória é consumida por esses objetos até que não haja mais indicadores sobre eles; no entanto, ao contrário de C e C ++, o coletor de lixo o pega na próxima passagem e libera a memória, sem exigir que você tenha que rastrear quais objetos estão liberados e quais não, na maioria dos casos (a menos que você tenha motivos para fazer referência fraca a objetos, por exemplo).