No entiendo la diferencia entre este caso:
#include <stdio.h> int main() { int i = 0; i = 1; return 0; }Y este caso:
#include <stdio.h> int main() { char *mychar = "H"; *mychar = "E"; return 0; }Lo que produce la advertencia del compilador "la asignación hace un número entero desde el puntero sin conversión".
¿No debería *mychar = "E" desreferenciar mychar para asignarle el valor de "E"?
Muchas gracias.
Has confundido algunas cosas.
const char[] que almacena 'E' y '\0' . No es un solo personaje. Para caracteres individuales usa '', como 'E' .mychar apunta al literal de cadena y no puede cambiar los literales de cadena.Si lo que tenías en mente es esto:
char *mychar = "H"; mychar = "E"; Esto está bien, no está cambiando el literal de cadena, solo la primera vez que el puntero mychar apunta al literal de cadena "H", luego a "E".
Esto no lo puedes hacer:
char *mychar = "Hello"; *mychar = 'E'; // Can't modify the string literalPero esto lo puedes hacer:
char c = 0; char *mychar = &c; *mychar = 'E'; // This is ok"E" es un literal de cadena (char*) y 'E' es un literal char (char).
Tenga en cuenta que las dos piezas de código que está comparando no son análogas. La diferencia entre las dos piezas de código (int vs char*) será más clara si escribes
char* mychar = "H"; *mychar = "E";El tipo correspondiente al ejemplo int es (char*). Es decir, el código que es análogo al ejemplo "int" es
char* mychar = "H"; mychar = "E";Los literales de cadena pueden almacenarse en la sección de memoria de solo lectura. La modificación de un literal de cadena invoca un comportamiento indefinido. No puedes modificarlo.
Agregue el calificador const para que su compilador sepa que la cadena no es modificable
char const *mychar = "H";También debe tener en cuenta que la declaración
*mychar = "E"; está mal por sí mismo. Está asignando un tipo char * a char .