STL provides a string class. Not a 'fundamental' type perhaps, but a usefull one nonetheless. It's member function c_str() returns a char* just in case you need that for function passing and whatnot.
I usually don't work with char arrays, but char pointers instead. Though these seem to be similar, using char* rather than char[] gives different results. For example, the == operator does actually compare the strings they contain:
char* a = "hello";
char* b = "hello";
if(a == b)
cout << "True";
else
cout << "False";
This prints True to screen. Changing b to "hello1" gives False. Comparing a string (#include <string>) with a char* gives the same results.
As far as I understand, the == operator compares char pointers as if they were null-terminated strings, comparing char by char, while it compares char arrays by their adresses.
I tested casting char arrays to char pointers, too, which gave interesting results:
((char*)s == (char*)t) == false, while
((char*)s[0] == (char*)t[0]) == true, provided both are assigned the same string value.
Not everything is clear to me, but there's a subtle difference between arrays and pointers. &s, for example, is the adress of the array, and while it's the same adress as the first element in the array (&s[0]), it's not of the same type: (&s + 1 == &s[0] + 1) == false.