First of all, what’s the difference between:
(1) const char*
(2) char const*
(3) const char const*
I’m fairly certain I understand this fully, but I’d like someone to give me a sentence for each, specifically, so it sticks in my head. It’s one of those things that I’m fine with until someone puts me on the spot and then it gets fuzzy!
Also, how are string-literalls stored by the compiler? This isn’t homework, I’m just brushing up on C for interviews in case anyone cares.
1 and 2 are equivalent, and specify the type of a pointer to a const
char. The pointer itself is not const. 3 is invalid, because it repeats “const”. It’s like sayingconst const int. The order is not relevant, so it’s also like sayingint const int.In C99 it is valid to repeat
constlike that. But in C++, you cannot repeat it.They are stored in an unspecified way. But compilers are allowed to store them in a read-only portion of the program. So you cannot write to string literals. You are guaranteed that they stay allocated through the whole program lifetime (in other words, they have static storage duration).
You should be aware of the subtle differences between C and C++. In C99, like explained above,
const const intis allowed. In C89 and C++ it is forbidden. In C++ you can however introduce a redundant const, if applied to a typedef that is itself const:Same goes for template parameters.