Three things are hiding inside that question, and they have different answers. nullptr as a value is zero in the only sense the language cares about. nullptr as a type is emphatically not zero. And nullptr as a bit pattern sitting in a register is whatever your hardware vendor felt like the year they shipped the ABI. Most of the grief people take from null comes from collapsing those three into one, and then acting surprised when the overload resolves wrong, or the memset produces a pointer that is not null, or the lock-free queue reads a tagged sentinel as a live node.
So let us take the pedantic question seriously, today's standards first, and then walk it all the way back to the year null was invented and apologized for. There is a lot of ground here. It is worth the walk, because almost every null bug in production is a confusion between those three meanings.
The rest of this article is for members
Members read every article and course in full from the moment it is
published, run their code on the certified C++ and Rust challenges, and
earn verifiable credentials. Subscriptions are what keep this site
independent.
Member-first article: it opens to everyone on
October 07, 2026. Members read it today.
Subscribe
Log in
Already a paid Substack subscriber?
Your access carries over
— register with the same email address.