Cómo declarar cadenas en C

Posible duplicado:
Asignación de memoria char * y char []

¿Alguien puede explicarme cuál es la diferencia entre estas líneas de código?

char *p = "String"; char p2[] = "String"; char p3[7] = "String"; 

¿En qué caso debo usar cada uno de los anteriores?

Este enlace debe satisfacer tu curiosidad.

Básicamente (olvidando su tercer ejemplo que es malo), el diferente entre 1 y 2 es que 1 asigna espacio para un puntero a la matriz.

Pero en el código, puede manipularlos como punteros de todos modos; lo único, no puede reasignar el segundo.

Las cadenas en C se representan como matrices de caracteres.

 char *p = "String"; 

Está declarando un puntero que apunta a una cadena almacenada en algún lugar de su progtwig (la modificación de esta cadena es un comportamiento indefinido) de acuerdo con el lenguaje de progtwigción C 2 ed.

 char p2[] = "String"; 

Está declarando una matriz de char inicializada con la cadena “String”, dejando al comstackdor el trabajo para contar el tamaño de la matriz.

 char p3[5] = "String"; 

Está declarando una matriz de tamaño 5 e inicializándola con “Cadena”. Este es un error porque “Cadena” no encaja en 5 elementos.

char p3[7] = "String"; es la statement correcta (‘\ 0’ es el carácter de terminación en c cadenas).

http://c-faq.com/~scs/cclass/notes/sx8.html

No deberías usar el tercero porque está mal. “Cadena” toma 7 bytes, no 5.

El primero es un puntero (se puede reasignar a una dirección diferente), los otros dos se declaran como matrices y no se pueden reasignar a diferentes ubicaciones de memoria (pero su contenido puede cambiar, use const para evitar eso).

 char *p = "String"; means pointer to a string type variable. 

char p3[5] = "String" ; significa que está predefiniendo el tamaño de la matriz para que no contenga más de 5 elementos. Tenga en cuenta que, para las cadenas, el valor nulo “\ 0” también se considera como un elemento. Por lo tanto, esta instrucción daría un error ya que la cantidad de elementos es 7, por lo que debería ser:

 char p3[7]= "String";