Let's look at the question asked here by the OP.
Is 0.0.0.0 a valid IP address?
Yes. Technically, this is a valid IP address, and other answers describe a lot of its options (I'm not going to publish Wikipedia links here ... or maybe it is).
So, I think the paxdiablo answer above is the most correct, but let's also look at the context of your question.
I want my program to be able to save it as an indication that no address is being used, but this will not work if it is really valid.
It completely depends on your use case. Given that this is a forum for programmers, let's look at this perspective.
If your software stores valid Internet addresses - server locations, visitors to your site, replication / mirroring or backup sites, web services or database servers, etc. - then it will be quite acceptable. No device on the Internet will ever be assigned this address, nor will it ever be converted to a valid connection.
On the other hand, if you are writing firmware for a firewall or router, this address takes on special significance; default route, accept any source / destination IP, block all IP source / destination, end-to-end control, etc., as indicated by all others. However, let me point out that if you are programming at this level, you should have a good enough understanding of network protocols so that you do not need to ask this question first.
Therefore, Iβm going to suggest that most people looking at this question fall into the first category, and assume that this is a perfectly correct way to store a null, empty or missing IP address if there is any reason why the actual null value cannot to be used. Even if you neglect validation and your software tries to connect to this IP address, it simply cannot establish a connection.