I know they are different, I know how they are different and I read all questions I could find regarding char* vs char[]
But all those answers never tell when they should be used.
So my question is:
When do you use
const char *text = "text";
and when do you use
const char text[] = "text";
Is there any guideline or rule?
As an example, which one is better:
void withPointer()
{
const char *sz = "hello";
std::cout << sz << std::endl;
}
void withArray()
{
const char sz[] = "hello";
std::cout << sz << std::endl;
}
(I know std::string is also an option but I specifically want to know about char pointer/array)
Both are distinctly different, For a start:
Read on for more detailed explanation:
The Array version:
Creates an array that is large enough to hold the string literal “text”, including its
NULLterminator. The arraytextis initialized with the string literal “text”.The array can be modified at a later time. Also, the array’s size is known even at compile time, sosizeofoperator can be used to determine its size.The pointer version:
Creates a pointer to point to a string literal “text”. This is faster than the array version, but string pointed by the pointer should not be changed, because it is located in an read only implementation defined memory. Modifying such an string literal results in Undefined Behavior.
In fact C++03 deprecates use of string literal without the
constkeyword. So the declaration should be:Also,you need to use the
strlen()function, and notsizeofto find size of the string since thesizeofoperator will just give you the size of the pointer variable.Which version is better?
Depends on the Usage.
EDIT: It was just brought to my notice(in comments) that the OP seeks difference between:
const char text[]andconst char* textWell the above differing points still apply except the one regarding modifying the string literal. With the
constqualifier the arraytestis now an array containing elements of the typeconst charwhich implies they cannot be modified.Given that, I would choose the array version over the pointer version because the pointer can be(by mistake)easily reseated to another pointer and the string could be modified through that another pointer resulting in an UB.