I'm confused about the datatype of a string literal. Is it a const char *
or a const char
?

- 30,738
- 21
- 105
- 131

- 12,815
- 19
- 97
- 126
-
See my answer http://stackoverflow.com/questions/12451496/what-is-the-data-type-for-a-string/12452097#12452097 to similar question. – PiotrNycz Sep 20 '12 at 17:52
-
12judging by the number of people that have this wrong (thinking its const char*) I fail to see why this is being down-voted. Apparently its a pretty damn good question when half the respondents don't know the answer. – WhozCraig Sep 20 '12 at 17:52
-
5@CraigNelson, I've seen way too many people with 10s of k of rep get it wrong over the last while. – chris Sep 20 '12 at 17:54
-
@CraigNelson i think that this is because the C++ behaviour on this matter is pretty unique considering the most popular languages on the scene, from C to Java string literals are treated like pointers or putted in a pool and then used by reference. probably there is a lot of confusion because of this unique behaviour. – Ken Sep 20 '12 at 17:57
-
2@Ken The only difference between C and C++ in this regard is the `const` qualifier. C treats it as a `char[N]` instead of `const char[N]` – Praetorian Sep 20 '12 at 18:00
-
@Prætorian in C a string like "Hello" is a pointer, also arrays and pointers adopt the arithmetic, you can assign "Hello" to a pointer in C. – Ken Sep 20 '12 at 18:08
-
@Ken, You can do that in C++. Arrays decay into pointers. Arrays don't offer arithmetic like pointers do. – chris Sep 20 '12 at 18:12
-
2@Ken, Here's proof they're arrays in C, using the same method Seth did for C++: http://liveworkspace.org/code/198d050af0d08a9fc86ac17c144d581d. If it was a pointer, the size would very likely not be 11. You can put one with a different length in there alongside the first if you want to eliminate weird pointer sizes. – chris Sep 20 '12 at 18:16
-
I think it is `const char (&) [N]` instead. – Hải Phạm Lê Dec 27 '22 at 10:21
2 Answers
It is a const char[N]
(which is the same thing as char const[N]
), where N
is the length of the string plus one for the terminating NUL
(or just the length of the string if you define "length of a string" as already including the NUL
).
This is why you can do sizeof("hello") - 1
to get the number of characters in the string (including any embedded NUL
s); if it was a pointer, it wouldn't work because it would always be the size of pointer on your system (minus one).

- 73,875
- 22
- 181
- 249
-
6To back it up, *A narrow string literal has type “array of n const char”, where n is the size of the string as defined below, and has static storage duration (3.7).* – chris Sep 20 '12 at 17:48
-
Won't disagree. However, when a string constant is used in template matching it appears to be as `char [N]` (and not `char const[N]`), at least in one usage... The context is: I have templ. mem. func `func(T const &x)` instantiated as `A.func("string")` and it matches with T as `char [7]`. Odd. Or perhaps because the parameter x is a 'const ref to an array [7] of const char' the second const is removed as redundant, and the first is not part of T. g++ 4.6.3 – greggo Feb 11 '14 at 16:04
-
1@greggo: C string literals are `char[]`. C++ up to and including C++03 *allows* (but deprecates) assigning a string literal to a non-const `char*` as well, although C++ string literals were *always* `const`. Starting with C++11, assigning a string literal to a non-const `char *` is *disallowed* without explicit casting. – DevSolar Sep 30 '14 at 08:15
-
@DevSolar Thanks , you made it stick in my mind , just one question, in C is string literal convertible to char * ? – Suraj Jain Dec 27 '16 at 10:29
-
1@SurajJain: *Any* array is "convertible" to a pointer to its first element. But you lose the ability to determine the size of the array via `sizeof`. – DevSolar Dec 27 '16 at 10:41
"Hello world"
is const char[12]
(eleven characters plus '\0'
terminator).
L"Hello world"
is const wchar_t[12]
.
And since C++14, "Hello world"s
is std::string
.
Also note the u8""
, u""
and U""
string literal notations added by C++11, which specify UTF-8, UTF-16 and UTF-32 encoding, respectively. The encoding of non-qualified string literals (i.e. ""
and L""
) is (and always was) implementation-defined.

- 67,862
- 21
- 134
- 209
-
Just a noob question: Does adding `s` to a string literal make it of type `std::string`? If not, why is it being used? – asn Jul 27 '19 at 17:18
-
@AjaySinghNegi Indeed `""s` is a way to have a [std::string literal](https://en.cppreference.com/w/cpp/string/basic_string/operator""s). You can have [user-defined literals](https://en.cppreference.com/w/cpp/language/user_literal) since C++11. – DevSolar Jul 27 '19 at 17:25
-
In cpp, doesn't a string literal implicitely convert to string if `string s = "abc;` is written. If Yes, then why is `""s` used? – asn Jul 27 '19 at 17:56
-
@AjaySinghNegi There are several reasons. One is that there is no conversion taking place. The literal **is** of type `std::string`. This can make a difference e.g. in template context. – DevSolar Jul 27 '19 at 18:01