+ 3
What is the difference between char* s and char s[]?
In C++, we may use one of these three ways to define a string: 1) char* s = "Hello World!"; 2) char s[] = "Hello World!"; 3) string s = " Hello World!"; I do get the third one but what is the difference between the first one and the the second one? The first one defines a pointer, doesn't it? Then how can it be used as a string? Please, could anyone explain me in detail about the difference in structure, compile time, runtime, memory allocation etc.? It is causing me trouble. Thanks!
6 Respostas
+ 2
That's  a good question,  and there is a difference between  char * s and  char s [] . However I am going to change names for my benefit , but every thing is the same.
#1)  char cname[]= 
     "Hello World" ;
#2)   char *pName =
       "Hello World";
The first one is a character array , because of the empty brackets.  Also the compiler counts the number of characters/letters plus the terminating null to mark the end of the string. 
The second is a character pointer that points to type char.
pName is a pointer variable
 meaning it stores the address of the array it points to.
But cname is a fixed pointer constant,  that is its address can't be changed. 
It is not a pointer variable. 
But variable values can be changed any time you feel like it. Just as I can do this
as long it is the same data type.  For example 
 float x = 2.4;
float y = 3.14 ;
then later in my code 
I can  do the same  with pointer variables. 
float x = 2.4 ;
float y = 3.14 ;
float  *ptr = &x ;
printf (" x is %f \n", *ptr);
then do this
ptr = &y;
printf ("y is %f ",  *ptr);
 I can do the same with character pointers. 
char * pName = "Rick";
then a few lines later
do this 
pName ="Saturday";
C/C++ compiler is not really putting Saturday into pName, because pName can hold only addresses. But the compiler is putting the
address of Saturday  into the pointer
variable pName.
Now  back to first one 
cname[] =
 "Hello World";
if I decide to change it later  to
cname ="error" ;  in my code, 
the compiler will give a error , because once the program is compiled , the compiler never uses the word cname it just uses the starting address of the first member of the array   and can never be changed. It is a fixed pointer constant.  cname is an address only.
That is 
I can't do this
2 = 10+ 2 ;
because 2 can't be assigned to   (10+2) , because it is also a constant 
and constants can't  be changed they are not variables. Just like I
can't do this
#define PI  3.1416
then do this PI = 4,   because constants are not variables. They are fixed .
+ 5
There is no difference. "12345" takes 6 bytes no matter what you store it in.
char s[] = {'1', '2', '3', '4', '5', '\0'};
All character strings include a null character to terminate the string.
x = s[5];
generates code like;
x = s + 5;
in both cases the address of s is put in a register, 5 gets added to the register, and the register gets stored back in x.
+ 3
There is no difference. C++ doesn't check types at that level so arrays and pointers are interchangeable so:
char *s = "Hello World!";
cout << s[11];
cout << &s[6];
is legal and outputs '!World!'.
+ 2
Thanks Naveen , I thought  at the time I might of confused people reading my post, but remember this  in my example cname [] is a  collection of variables of the same type , and cname
and  is the starting address of the array and pName is a pointer variable and I am glad I helped you understand the difference between the two.
0
@John Wells
What about the differences in memory allocation, compile time etc.?
0
@Rick Zalman Thanks a lot!



