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
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 *someArraydeclare someArray as pointer to const char
cdecl> explain char * const someArraydeclare someArray as const pointer to char
cdecl> explain const char * const s2declare 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.
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.
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?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
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