S1:
snip1: char p[] = "abc"; *(p+1) = 'a';
snip2: char * p ="abc"; *(p+1) = 'a';
Snip2 will be compiling-warning. For the char pointer p points to a constant char array, and it change the constant string latter.
Snip1 will pass compiling successfully. For the "abc" is copied to the memory for char p[].
S2:
char str1[3],str2[3];
str1="ab";
str2=str1;//error!
strcpy(str2,str1);//right!
reason: the compiler see the operater "=" to be the "=" of pointer operation(invalid).