C strings puntero vs matrices

Posible duplicado:
¿Cuál es la diferencia entre char s [] y char * s en C?

Por que es:

char *ptr = "Hello!" 

diferente que:

 char ptr[] = "Hello!" 

Específicamente, no veo por qué puede usar (* ptr) ++ para cambiar el valor de ‘H’ en la matriz, pero no el puntero.

¡Gracias!

Puede (en general) usar la expresión (*ptr)++ para cambiar el valor que ptr apunta cuando ptr es un puntero y no una matriz (es decir, si ptr se declara como char* ptr ).

Sin embargo, en su primer ejemplo:

 char *ptr = "Hello!" 

ptr está apuntando a una cadena literal, y no se permite que las cadenas literales se modifiquen (en realidad pueden almacenarse en el área de la memoria que no se puede escribir, como ROM o páginas de memoria marcadas como de solo lectura).

En tu segundo ejemplo,

 char ptr[] = "Hello!"; 

La matriz se declara y la inicialización en realidad copia los datos en el literal de cadena en la memoria de matriz asignada. Esa memoria de matriz es modificable, por lo que (*ptr)++ funciona.

Nota: para su segunda statement, el identificador ptr sí mismo es un identificador de matriz, no un puntero y no es un ‘lvalue’, por lo que no puede modificarse (aunque se convierte fácilmente en un puntero en muchas situaciones). Por ejemplo, la expresión ++ptr sería inválida. Creo que este es el punto que algunas otras respuestas están tratando de hacer.

Lea las preguntas frecuentes sobre el lenguaje C. Especialmente la matriz y las secciones de punteros .

Las matrices asignan espacio automáticamente y no se pueden reubicar ni cambiar de tamaño, mientras que los punteros se asignan explícitamente para apuntar al espacio asignado y se pueden reubicar.

Los nombres de matrices son de solo lectura !

Si usas una cadena literal "Hello!" , el literal en sí mismo se convierte en una matriz de 7 caracteres y se almacena en algún lugar de la memoria de datos. Esa memoria puede ser de solo lectura.

La statement

 char *ptr = "Hello!"; 

define un puntero a char y lo inicializa, almacenando la dirección del principio del literal (esa matriz de 7 caracteres mencionados anteriormente) en él. Cambiar el contenido de la memoria apuntada por ptr es ilegal.

La statement

 char ptr[] = "Hello!"; 

define una matriz char ( char ptr[7] ) y la inicializa, copiando caracteres del literal a la matriz. La matriz puede ser modificada.

en C las cuerdas son matrices de caracteres. Un puntero es una variable que contiene la ubicación de memoria de otra variable. Una matriz es un conjunto de elementos de datos ordenados. cuando pones (* ptr) ++ obtienes Fallo de Segmentación con el puntero.

Quizás esté agregando 1 a toda la cadena (con el puntero), en lugar de agregar 1 al primer carácter de la variable (con la matriz).

Al apuntar a un literal de cadena, no debe declarar que los caracteres sean modificables, y algunos comstackdores le avisarán de esto:

 char *ptr = "Hello!" /* WRONG, missing const! */ 

La razón es, como lo han dicho otros, que los literales de cadena pueden almacenarse en una parte inmutable de la memoria del progtwig.

La “anotación” correcta para usted es asegurarse de que tiene un puntero a carácter constante:

 const char *ptr = "Hello!" 

Y ahora ve directamente que no puede modificar el texto almacenado en el puntero.