char[6] string = "hello";
не будет работать вообще. Вы имеете в виду char string[] = "hello";
И да, вы можете иметь указатели псевдоним друг на друга, то есть указывать на один и тот же буфер. Будьте осторожны, чтобы вы не free
оба из них, хотя, или использовать любой из указателей псевдонимов после того, как один из них был free
'd.
Это, на самом деле, очень полезно. Рассмотрим типичную реализацию strcpy
, которая должна возвращать свой первый аргумент:
char *strcpy(char *dest, char const *src)
{
char *p = dest; // aliasing pointers
while (*src != '\0')
*p++ = *src++;
return dest;
}
И да, после char *p2 = p1
вы можете указать p1
на другой буфер, но это в основном полезно в алгоритмах хитрых указателей. Опять же, будьте осторожны с распределением памяти.