The problem is that the conditional operator in C promotes the 2nd and 3rd operands to match each other. A promoted variable is a rvalue and not a lvalue, so the ?: always returns a rvalue.
The * operator on the other hand, returns a lvalue. That is why (*(argc <= 1 ? ptr_a : ptr_b))++
works, because ++ is applied to the result of * which is a lvalue.
But in the case of (argc <= 1 ? *ptr_a : *ptr_b)
the result is a rvalue so ++ cannot be used.