El calificador const se puede aplicar a la declaración de cualquier variable para especificar que su valor no cambiará (que depende de dónde se almacenan las variables const, podemos cambiar el valor de la variable const usando el puntero). El resultado está definido por la implementación si se intenta cambiar una const.
1) Puntero a variable.
C
int *ptr;
Podemos cambiar el valor de ptr y también podemos cambiar el valor del objeto al que apunta ptr. El puntero y el valor apuntado por el puntero se almacenan en el área de lectura y escritura. Consulte el siguiente fragmento de código.
C
#include <stdio.h> int main(void) { int i = 10; int j = 20; int *ptr = &i; /* pointer to integer */ printf("*ptr: %d\n", *ptr); /* pointer is pointing to another variable */ ptr = &j; printf("*ptr: %d\n", *ptr); /* we can change value stored by pointer */ *ptr = 100; printf("*ptr: %d\n", *ptr); return 0; }
Producción:
*ptr: 10 *ptr: 20 *ptr: 100
2) Puntero a constante.
El puntero a constante se puede declarar de las siguientes dos maneras.
C
const int *ptr;
o
C
int const *ptr;
Podemos cambiar el puntero para que apunte a cualquier otra variable entera, pero no podemos cambiar el valor del objeto (entidad) apuntado usando el puntero ptr. El puntero se almacena en el área de lectura-escritura (pila en el presente caso). El objeto apuntado puede estar en el área de solo lectura o de lectura y escritura. Veamos los siguientes ejemplos.
C
#include <stdio.h> int main(void) { int i = 10; int j = 20; /* ptr is pointer to constant */ const int *ptr = &i; printf("ptr: %d\n", *ptr); /* error: object pointed cannot be modified using the pointer ptr */ *ptr = 100; ptr = &j; /* valid */ printf("ptr: %d\n", *ptr); return 0; }
Producción:
error: assignment of read-only location ‘*ptr’
El siguiente es otro ejemplo donde la variable i en sí misma es constante.
C
#include <stdio.h> int main(void) { /* i is stored in read only area*/ int const i = 10; int j = 20; /* pointer to integer constant. Here i is of type "const int", and &i is of type "const int *". And p is of type "const int", types are matching no issue */ int const *ptr = &i; printf("ptr: %d\n", *ptr); /* error */ *ptr = 100; /* valid. We call it up qualification. In C/C++, the type of "int *" is allowed to up qualify to the type "const int *". The type of &j is "int *" and is implicitly up qualified by the compiler to "const int *" */ ptr = &j; printf("ptr: %d\n", *ptr); return 0; }
Producción:
error: assignment of read-only location ‘*ptr’
La calificación hacia abajo no está permitida en C++ y puede causar advertencias en C. A continuación se muestra otro ejemplo con calificación hacia abajo.
C
#include <stdio.h> int main(void) { int i = 10; int const j = 20; /* ptr is pointing an integer object */ int *ptr = &i; printf("*ptr: %d\n", *ptr); /* The below assignment is invalid in C++, results in error In C, the compiler *may* throw a warning, but casting is implicitly allowed */ ptr = &j; /* In C++, it is called 'down qualification'. The type of expression &j is "const int *" and the type of ptr is "int *". The assignment "ptr = &j" causes to implicitly remove const-ness from the expression &j. C++ being more type restrictive, will not allow implicit down qualification. However, C++ allows implicit up qualification. The reason being, const qualified identifiers are bound to be placed in read-only memory (but not always). If C++ allows above kind of assignment (ptr = &j), we can use 'ptr' to modify value of j which is in read-only memory. The consequences are implementation dependent, the program may fail at runtime. So strict type checking helps clean code. */ printf("*ptr: %d\n", *ptr); return 0; } // Reference: // http://www.dansaks.com/articles/1999-02%20const%20T%20vs%20T%20const.pdf // More interesting stuff on C/C++ @ http://www.dansaks.com/articles.shtml
3) Puntero constante a variable.
C
int *const ptr;
La declaración anterior es un puntero constante a una variable entera, lo que significa que podemos cambiar el valor del objeto apuntado por el puntero, pero no podemos cambiar el puntero para que apunte a otra variable.
C
#include <stdio.h> int main(void) { int i = 10; int j = 20; /* constant pointer to integer */ int *const ptr = &i; printf("ptr: %d\n", *ptr); *ptr = 100; /* valid */ printf("ptr: %d\n", *ptr); ptr = &j; /* error */ return 0; }
Producción:
error: assignment of read-only variable ‘ptr’
4) puntero constante a constante
C
const int *const ptr;
La declaración anterior es un puntero constante a una variable constante, lo que significa que no podemos cambiar el valor señalado por el puntero, así como tampoco podemos apuntar el puntero a otras variables. Veamos con un ejemplo.
C
#include <stdio.h> int main(void) { int i = 10; int j = 20; /* constant pointer to constant integer */ const int *const ptr = &i; printf("ptr: %d\n", *ptr); ptr = &j; /* error */ *ptr = 100; /* error */ return 0; }
Producción:
error: assignment of read-only variable ‘ptr’ error: assignment of read-only location ‘*ptr’
Resumen :
Escribe | Declaración |
cambio de valor del puntero ( * punto = 100 ) |
cambio de valor señalador (ptr = &a) |
1) Puntero a Variable | int * punto | sí | sí |
2) Puntero a constante |
|
no | sí |
3) Puntero constante a variable | int * constante ptr | sí | no |
4) Puntero constante a constante | const int * const ptr | no | no |
Este artículo está compilado por “ Narendra Kangralkar ”. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA