char * vs const char * como parámetro

Hay muchas veces que obtengo errores de comstackción cuando uso char* lugar de const char* . Por lo tanto, no estoy seguro de la diferencia real, la syntax y el mecanismo de comstackción.

Si buscas la diferencia entre los dos, piensa en ellos como:

  • char * es un puntero que apunta a una ubicación que contiene un valor de tipo char que también se puede cambiar. El valor del puntero se puede cambiar, es decir, el puntero se puede modificar para apuntar a diferentes ubicaciones.
  • const char * es un puntero, cuyo valor también se puede cambiar, que apunta a una ubicación que contiene un valor de tipo char que no se puede cambiar.

const char * significa “puntero a un carácter no modificable”. Por lo general, se utiliza para cadenas de caracteres que no deben modificarse.

Digamos que estás escribiendo esta función:

 int checkForMatch(const char * pstr) 

Usted prometió (a través de la firma de la función) que no cambiará la cosa señalada por pstr . Ahora digamos que parte de la comprobación de una coincidencia implicaría ignorar el caso de las letras, y trató de hacerlo convirtiendo la cadena a mayúsculas antes de hacer sus otras comprobaciones:

 strupr(pstr); 

Obtendrá un error que dice que no puede hacer eso, porque strupr se declara como:

 char * strupr(char* str); 

… y eso significa que quiere poder escribir en la cadena. No puedes escribir a los caracteres en un const char * ( const char * eso es la const ).

En general, puede pasar un char * a algo que espera un const char * sin un reparto explícito porque es algo seguro (dar algo modificable a algo que no pretende modificarlo), pero no puede pasar un const char * en algo que espera un char * (sin un reparto explícito) porque eso no es algo seguro de hacer (pasar algo que no está destinado a ser modificado en algo que pueda modificarlo).

Por supuesto, esto es C, y puedes hacer casi cualquier cosa en C, incluyendo enviar explícitamente un const char * a un char * , pero eso sería una muy, muy mala idea porque hay (probablemente) alguna razón por la que ser señalado por el puntero es const .

Probablemente soy demasiado exigente. En mi libro, los caracteres señalados por un const char * posiblemente se pueden cambiar pero no a través del const char *. Un const char * puede apuntar a un almacenamiento modificable. Ejemplo:

 char a[] = "abracadabra"; const char * ccp = &a[0]; // ccp points to modifiable storage. *&a[0] = 'o'; // This writes to a location pointed to by const char* ccp 

Por lo tanto, mi redacción es:

Un char * es un puntero que se puede cambiar y que también permite escribir a través de él cuando se elimina la referencia a través de * o [].

Un const char * es un puntero que se puede cambiar y que no permite escribirlo cuando se elimina la referencia mediante * o [].

Siempre trato de definir parámetros con const char* not char* porque la conversión de std::string a conts char* es fácil mediante el método .c_str() . Sin embargo, convertir std::string a char* no es tan fácil.