2009-09-18 14 views
15

Estoy revisando C y tengo una pregunta con respecto al uso de const con punteros. Entiendo el siguiente código:uso constante con punteros en C

const char *someArray 

Esta es la definición de un puntero que apunta a tipos de carbón y el modificador const significa que los valores almacenados en someArray no se pueden cambiar. Sin embargo, ¿qué significa lo siguiente?

char * const array 

¿Es esta una forma alternativa de especificar un parámetro que es un puntero char a una matriz denominada "matriz" que es const y no puede ser modificado?

Por último, lo que hace esta combinación significa:

const char * const s2 

Como referencia, éstos se han extraído del libro de programación C Deitel en el capítulo 7, y todos ellos se utilizan como parámetros pasados ​​a las funciones.

Respuesta

41

const char* es, como usted dijo, un puntero a un char, donde no puede cambiar el valor del carácter (al menos no a través del puntero (sin eliminar la constness)).

char* const es un puntero a un char, 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 se puede cambiar el puntero ni el valor del punto.

+0

Gracias por el gran resumen! –

+0

No tienes idea de cuántas veces he comprobado esta respuesta ... ¡LOL! ¡Muchas gracias! – kazbeel

3
char * const array; 

Significa que el puntero es constante. Además,

const * const char array; 

significa un puntero constante a la memoria constante.

7

usted debe 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> 
+0

¿Es esta una utilidad solo para Linux? –

+0

Nunca he tratado de usarlo de lo contrario, pero estoy seguro de que está disponible para otros sistemas operativos, como parte de cygwin u otros. –

+0

Hmm. Ok, veré si hay una compilación Mac o si viene con XCode. ¡Gracias! –

13
//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 

}

+0

¡Excelentes muestras de código, gracias! –

0

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

Tome 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 propio puntero const, al igual que en el ejemplo f2, es absolutamente casi sin sentido. Cada parámetro pasado 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, es buf sin cambios después de la llamada a la función.


Considérese la función strcpy()

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

Una posible aplicación es

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

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