sirven - punteros y matrices en c
Uso constante con punteros en C (6)
Voy a revisar C y tengo una pregunta sobre el uso de const
con punteros. Entiendo el siguiente código:
const char *someArray
Esto es definir un puntero que apunta a tipos de caracteres 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 a un conjunto llamado "array" que es const
y no se puede modificar?
Por último, ¿qué significa esta combinación:
const char * const s2
Para referencia, se toman del libro de programación de Deitel C en el Capítulo 7 y todos estos se utilizan como parámetros pasados a las funciones.
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 const
, como en el ejemplo f2, es absolutamente casi 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.
Considera 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
como 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.
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>
¿Cuál es la diferencia entre const int *, const int * const, int const * :
Léalo 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
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 lanzar la constancia)).
char* const
es un puntero a un char, donde puede cambiar el char, pero no puede hacer que el puntero apunte a un char diferente.
const char* const
es un puntero constante a un char constante, es decir, no puede cambiar dónde apunta el puntero ni el valor del pointee.
//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
}
char * const array;
Significa que el puntero es constante. También,
const * const char array;
Significa un puntero constante a la memoria constante.