uso constante con punteros en C

3 minutos de lectura

avatar de usuario
scott davies

Estoy revisando C y tengo una pregunta sobre const uso con punteros. Entiendo el siguiente código:

const char *someArray

Esto está definiendo un puntero que apunta a tipos de char y el const modificador significa que los valores almacenados en someArray no puede ser cambiado. Sin embargo, ¿qué significa lo siguiente?

char * const array

¿Es esta una forma alternativa de especificar un parámetro que es un puntero de caracteres a una matriz llamada “matriz” que es const y no se puede modificar?

Por último, ¿qué significa esta combinación?

const char * const s2

Como referencia, estos se toman del libro de programación de Deitel C en el Capítulo 7 y todos estos se usan como parámetros que se pasan a las funciones.

const char* es, como dijiste, un puntero a un carácter, donde no puedes cambiar el valor del carácter (al menos no a través del puntero (sin descartar la constancia)).

char* const es un puntero a un carácter, donde puede cambiar el carácter, pero no puede hacer que el puntero apunte a un carácter diferente.

const char* const es un puntero constante a un carácter constante, es decir, no puede cambiar el lugar donde apunta el puntero ni el valor de la punta.

  • No tienes idea de cuántas veces he revisado esta respuesta… ¡LOL! ¡Muchas gracias!

    – kazbel

    25 de julio de 2014 a las 7:45

avatar de usuario
mloskot

De cuál es la diferencia entre const int*, const int * const, int const *:

Leelo al revés…

int* - pointer to int
int const * - pointer to const int
int * const - const pointer to int
int const * const - const pointer to const int

//pointer to a const
void f1()
{
    int i = 100;
    const int* pi = &i;
    //*pi = 200; <- won't compile
    pi++;
}

//const pointer
void f2()
{
    int i = 100;
    int* const pi = &i;
    *pi = 200;
    //pi++; <- won't compile
}

//const pointer to a const
void f3()
{
    int i = 100;
    const int* const pi = &i;
    //*pi = 200; <- won't compile
    //pi++; <- won't compile

}

deberías probar cdecl:

~ $ cdecl
Type `help' or `?' for help
cdecl> explain const char *someArray
declare someArray as pointer to const char
cdecl> explain char * const someArray
declare someArray as const pointer to char
cdecl> explain const char * const s2
declare s2 as const pointer to const char
cdecl>

char * const array;

Significa que el puntero es constante. También,

const * const char array;

significa un puntero constante a la memoria constante.

avatar de usuario
pmg

Repitiendo lo que escribieron otros usuarios, pero quiero proporcionar contexto.

Toma estas dos definiciones:

void f1(char *ptr) {
    /* f1 can change the contents of the array named ptr;
     * and it can change what ptr points to */
}
void f2(char * const ptr) {
    /* f2 can change the contents of the array named ptr;
     * but it cannot change what ptr points to */
}

Hacer el puntero en sí constcomo en el ejemplo f2, es absolutamente casi sin sentido. Cada parámetro que se pasa a una función se pasa por valor. Si la función cambia ese valor, solo cambia su copia local y no tiene efecto en el código de llamada.

/* ... calling code ... */
f1(buf);
f2(buf);

En cualquier caso, buf no cambia después de la llamada a la función.


Considere la función strcpy()

char *strcpy(char *dest, const char *src);

Una posible implementación es

char *strcpy(char *dest, const char *src) {
    char *bk = dest;
    while (*src != '\0') {
        *dest++ = *src++;
    }
    *dest = *src;
    return bk;
}

Esta implementación cambia tanto dest y src dentro de la función solamente. Hacer cualquiera de los punteros (o ambos) const no ganaría nada para la función strcpy() o para el código de llamada.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad