A string, in C is an array of chars where the last char is '\0' (NUL char)... Because it is an array, a pointer points to the first element of this array, so the pointer isn't "the string", but a reference to it.
When you declare an array with fixed size, it's name is a const pointer to the first element (cannot be changed),
unless when used in a function argument. In this later case, the array notation is only a sintatic helper, since the argument is, indeed, a pointer:
Code:
int f(int buff[30]); // this...
int f(int *buff); // ... is the same as this
No array bounds are checked.
Of course you can make a pointer constant using 'const' keyword:
Code:
int f( int * const buff ); // buff cannot be changed inside the function, but the pointed data can.
int f( const int *buff ); // buff can be changed inside the function, but the pointed data can't.
int f( const int * const buff ); // neither buff or pointed data can be changed.