Much of my experience is with relatively constrained systems, where code bloat of this kind is undesirable. So my own instinct is to either use debug-only assertions, or to leave it out entirely. You'd hope that any possible invalid inputs will occur during testing of the caller who gives you the bad values, so provided that you test in debug mode as well as release mode you'll see the diagnostics. Otherwise, you'll debug the crash when it eventually happens.
If code size and performance don't matter (and in almost all code a simple null or range check won't affect performance anyway), then the more asserts you leave in your code in release mode, the more chance you have of diagnosing faults without needing to re-create the bug in test mode. This can be a big time saver. In particular, if your product is a library then a significant proportion of "fault" reports are due to customer errors, so no amount of pre-release testing can prevent them occurring in the wild. The sooner you can prove to the customer that their code is wrong, the sooner they can fix it and you can get back to finding your own bugs.
Still, in C/C++ I find that the specific case of checking for null pointers is only a minor help. If someone passes you a pointer, then the full validity condition isn't "must not be null". It needs to point to memory which is readable (perhaps also writeable) by the current process out to a certain size, and contains the correct type of object, possibly in a certain subset of all possible states. It needs not to have been freed, not to have been trashed by a buffer overrun elsewhere, probably not to be concurrently modified by another thread, etc. You aren't going to test all that at method entry, so you can still miss invalid parameters. Anything which leads you or other programmers to think "this pointer isn't null so it must be valid", because you've tested only one small part of the validity condition, is misleading.
If you're passing by pointer at all, then you are already in territory where you need to trust the caller not to give you garbage. Rejecting one particular instance of garbage still leaves you trusting the caller not to give you any of the myriad other kinds of garbage they can conjure that are harder to detect. If you find that null pointers are a common kind of garbage from your particular callers, then by all means test for them, since it saves time diagnosing bugs elsewhere in the system. It depends on an assessment whether finding bugs in your caller's code with the symptom "passes a null pointer to me" is worth bloating your own code (perhaps in binary size, and certainly in source cruft): if such bugs are rare then you're probably wasting time and screen real estate checking for them.
Of course in some languages you don't pass by pointer and the caller has only limited opportunities to corrupt memory, so there's less scope for garbage. But in Java, for instance, passing the wrong object is still a more common programming error than passing an erroneous null. Nulls are in any case usually fairly easy to diagnose if you leave them to the runtime to spot, and look at the stacktrace. So the value of null-checking is quite limited even there. In C++ and C# you can use pass-by-reference where nulls would be prohibited.
The same goes for any other specific invalid input you might test for, and any language. Full pre- and post-condition testing (if possible), is of course another matter, since if you can test the entire call contract then you're on much firmer ground. And if you can use weaving or whatever to assert contracts without adding to source code of the function itself, that's even better.