cadenas en C están representados como matrices de caracteres.
char *p = "String";
Usted está declarando un puntero que apunta a una cadena almacenada en algún lugar en su programa (modificación de esta cadena es un comportamiento indefinido) de acuerdo con el lenguaje de programación C 2 ed.
char p2[] = "String";
Usted está declarando una matriz de char inicializado con la cadena "Cadena", dejando al compilador el trabajo para contar el tamaño de la matriz.
char p3[5] = "String";
Usted declara una matriz de tamaño 5 y la inicializa con "Cadena". Este es un error porque "Cadena" no encaja en 5 elementos.
char p3[7] = "String";
es la declaración correcta ('\ 0' es el carácter de terminación en c cadenas).
http://c-faq.com/~scs/cclass/notes/sx8.html
Bueno, eso último es un desbordamiento de búfer, así que es agradable. – Dan
Su tercer ejemplo debe ser 'p3 [6]': debe tener en cuenta el 0 – fge
final @fge: necesita 7, de hecho. – Mat