uso constante con punteros en C

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

 const char *someArray 

Esto define un puntero que apunta a tipos de char 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 llamada “matriz” que es const y no se puede modificar?

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

 const char * const s2 

Como referencia, estos están tomados del libro de progtwigción Deitel C en el Capítulo 7 y todos estos se usan como parámetros pasados ​​a funciones.

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

char* const es un puntero a un char, donde puedes cambiar el char, pero no puedes hacer que el puntero apunte a un char diferente.

const char* const es un puntero constante a un carácter constante, es decir, no puede cambiar el puntero ni el valor del punto.

De lo que es la diferencia entre const int *, const int * const, int const * :

Léelo 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
 Escriba `help 'o`?'  por ayuda
 cdecl> explicar const char * someArray
 declarar someArray como puntero a const char
 cdecl> explain char * const someArray
 declarar someArray como const pointer a char
 cdecl> explicar const char * const s2
 declarar s2 como const pointer para 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.

Repitiendo lo que otros usuarios escribieron, 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 que el puntero sea const , como en el ejemplo f2, es absolutamente inútil. 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, 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.