[Programación] Re: [Programación] char* y const char*

Pablo programacion@lugro.org.ar
Tue, 26 Oct 2004 08:01:29 -0300


La diferencia es solo en el hecho de que lo que apuntas con un
const char* no puede ser modificado. Es para dejar mas clara
la semántica de las funciones y evitar errores. Mira este ejemplo:

int main(int argc, char* argv[])
{
1     const char *no_modifico_loque_apunto;
2     char *puedo_modificar_loque_apunto;
3     char szNombre[] = "Pablo";
4     char szApellido[] = "Armando";
    /* Inicializamos a algo */
5     no_modifico_loque_apunto = szNombre;
6     puedo_modificar_loque_apunto = szNombre;

     /* Error, trato de modificar algo a traves de un puntero const */
7     no_modifico_loque_apunto[0] = 'X';
    /* Perfecto, trato de modificar algo a traves de un puntero NO const */
8     puedo_modificar_loque_apunto[0] = 'Y';
    /* Si puedo modificar a donde apunto con un puntero const */
9     no_modifico_loque_apunto = szApellido;
    /* Esto no deberia traer ninguna duda */
10   puedo_modificar_loque_apunto = szNombre;
11   return 0;
}
 Asi en la linea 7 se produce un error de compilacion ( claro hombre!! esto
solo lo usa el compilador... en tiempo de ejecucion es solo una direccion
mas!!)
porque trato de modificar algo  _=a traves=-_  de un puntero 'const'. Pero
en
la linea numerada como 8, si bien apunto al mismo lado, no tengo problemas
en
realizar los cambios ya que lo hago _=a traves=-_ de un puntero *comun*
llamemosle.

Por otro lado, la linea 1 se lee más o menos asi:
1     const char *no_modifico_loque_apunto;
        Hasta aca <---------------- Desde aca

" no_modifico_loque_apunto es un puntero a algo que es de tipo
  char que es constante, es decir, que no lo puedo modificar."
  Leelo de atras para adelante.

2     char *puedo_modificar_loque_apunto;
"puedo_modificar_loque_apunto" es un puntero a algo de tipo
 char". No hay restriccion sobre si se puede o no modificar.

Ahora si vos tenes una funcion que SOLO necesita leer un valor, y
queres estar seguro de dejar en claro, para vos y los demas, que no
vas a modificar ese valor. La declaras de esta forma.

int SumarCadaLetra(const char* cadena);
( toma "abcd" y devuelve la suma de 'a'+'b'+'c'+'d' con return )

Y la llamas asi:

{
    char szNombre[] = "Pablo";
    /* No hay problemas de char* a const char* */
    SumarCadaLetra(szNombre);
}

Pero si vas a modificar el contenido del puntero que te pasan como
parametro, la declaras de esta otra forma.

void Convertir_a_Mayusculas( char *cadena );
( toma "hola" y devuelve "HOLA" en el mismo parametro )



Por otro lado tambien tenes los tipos
    char szNombre[] = "Pablo";
    char szNombre[] = "Armando";
    char *const no_me_cambias_ni_por_puta = szNombre;

Donde no podes cambiar a donde apunta el puntero, pero si
su contenido. Entonces, esto NO funciona:

    no_me_cambias_ni_por_puta = szApellido;

Pero esto SI anda sin problemas:

    no_me_cambias_ni_por_puta[0] = 'Q';


Bueno, hay mucho mas para explicar sobre const y los punteros, pero
con esto creo que te aclare el panorama. De todas formas no dejes de
consultar algun buen libro sobre C. En UTN estaba el "Manual de Borland C++"
viejo, pero a mi me encanto !!!!

            Saludos. Pablo.

----- Original Message ----- 
From: "HHDG" <cuatriangulo@yahoo.com.ar>
To: <programacion@lugro.org.ar>
Sent: Tuesday, October 26, 2004 7:33 AM
Subject: [Programación] char* y const char*


> Como dice el asunto: char* y const char*,
> Si alguien quiere explicar la diferencia entre estos tipos,
> se lo agradezco, últimamente me los estoy encontrando seguido.
> y las conversiones entre ellos se me hicieron imposibles, tuve
> que cambiar algunas de mis funciones, las pasé a const char
> para evadir problemas, pero quisiera saber más al respecto.
> Gracias
>
>
>
> _______________________________________________
> Programacion mailing list
> Programacion@lugro.org.ar
> http://www.lugro.org.ar/mailman/listinfo/programacion