La respuesta depende del idioma que estés usando.
C / C ++
En C y C ++, la palabra clave era NULL, y lo que realmente era NULL era 0. Se decidió que "0x0000" nunca sería un puntero válido a un objeto, y ese es el valor que se asigna para indicar que No es un puntero válido. Sin embargo, es completamente arbitrario. Si intentas acceder a él como un puntero, se comportaría exactamente como un puntero a un objeto que ya no existe en la memoria, provocando una excepción de puntero no válida. El puntero mismo ocupa memoria, pero no más de lo que lo haría un objeto entero. Por lo tanto, si tiene 1000 punteros nulos, es el equivalente a 1000 enteros. Si algunos de esos punteros apuntan a objetos válidos, entonces el uso de la memoria sería el equivalente a 1000 enteros más la memoria contenida en esos punteros válidos. Recuerda que en C o C ++,no implica que se haya liberado memoria, por lo que debe eliminar explícitamente ese objeto utilizando dealloc (C) o eliminar (C ++).
Java
A diferencia de C y C ++, en Java nulo es simplemente una palabra clave. En lugar de administrar nulo como un puntero a un objeto, se administra internamente y se trata como un literal. Esto eliminó la necesidad de vincular los punteros como tipos enteros y permite que Java abstraiga los punteros por completo. Sin embargo, incluso si Java lo oculta mejor, siguen siendo punteros, lo que significa que 1000 punteros nulos aún consumen el equivalente de 1000 enteros. Obviamente, cuando apuntan a objetos, al igual que C y C ++, la memoria es consumida por esos objetos hasta que no haya más punteros que los hagan referencia, sin embargo, a diferencia de C y C ++, el recolector de basura lo recoge en su próxima pasada y libera la memoria, sin requerir que tenga que hacer un seguimiento de qué objetos se liberan y cuáles no, en la mayoría de los casos (a menos que tenga razones para hacer referencia débil a los objetos, por ejemplo).