Apuntadores en C
Definicion de Apuntadores en C.
Los apuntadores son variables que almacenan direcciones de memoria. Un apuntador contiene la dirección de memoria de otra variable. Se dice que un apuntador "apunta" a la variable cuyo valor se almacena a partir de la dirección de memoria que contiene el apuntador.
Los apuntadores se utilizan ampliamente en C y C++ para tres propósitos principales:
- Asignar nuevos objetos en el montón
- Pasar funciones a otras funciones
- para iterar sobre elementos en matrices u otras estructuras de datos.
Los apuntadores son variables que se pueden modificar. A un apuntador se le puede sumar o restar un entero n; esto hace que apunte n posiciones adelante o atrás del valor actual. También se les puede aplicar el operador ++ o el operador –. Haciendo que contenga la dirección siguiente o anterior del elemento.
Referenciacion de apuntadores en C.
La referenciación es el proceso de obtener la dirección de una variable. En C y C++, esto se hace utilizando el operador "&". Por ejemplo, si un apuntador p almacena la dirección de una variable x, se dice que “p apunta a x”.
Los punteros se pueden utilizar para referenciar y manipular estructuras de datos, para referenciar bloques de memoria asignados dinámicamente y para proveer el paso de argumentos por referencias en las llamadas a funciones.
Para declarar un puntero, se le debe informar a C que es lo que uno desea almacenar en memoria. Por ejemplo: char *p, int *p, float *p.
Desreferenciacon de apuntadores
La desreferenciación es la obtención del valor almacenado en el espacio de memoria donde apunta un apuntador. En C y C++ esto se hace a traves del operador ‘*’, aplicado al apuntador que contiene la direccion del valor. La desreferenciación de un puntero significa obtener el valor de la variable a la que apunta el puntero.
Para acceder a los campos de un objeto apuntado por un puntero, se puede desreferenciar dicho puntero y usar el operador punto (.) o bien usar el operador flecha (->).
El operador . * se utiliza para anular la referencia de punteros a miembros de clase. El primer operando debe ser de tipo clase.
El operador de indirección (*) no se distribuye a todos los nombres de variables de una declaración. Cada apuntador debe ser declarado con el * prefijo al nombre.
Declaracion de Apuntadores o Punteros
Para declarar un puntero en C, se debe informar a C el tipo de lo que se desea almacenar en memoria. Por ejemplo, para declarar un puntero a char, se puede escribir char *p.
La sintaxis general para declarar un puntero es:
Tipo_dato *nombre de apuntador;
Donde:
- Tipo_dato: Especifica el tipo de objeto apuntado y puede ser cualquier tipo (int, float, char, etc).
- Nombre de apuntador: Es el identificador (nombre asignado) del apuntador.
Por ejemplo, para declarar un puntero a int, se puede escribir int *ptr.
Para declarar un puntero, se debe anteponer un * (asterisco) antes del nombre de la variable. Este asterisco identifica que la variable es un puntero.
La declaración de un puntero reservará espacio en memoria para guardar un puntero, no para el tipo de datos al que apunta.
Asignación de apuntadores
Se pueden asignar a un apuntador direcciones de variables a través del operador de referenciación (‘&’) o direcciones almacenadas en otros apuntadores.
Verificación de tipos en apuntadores
En C, los apuntadores se vinculan a tipos de datos específicos. Esto significa que solo se pueden asignar direcciones de variables del tipo especificado en la declaración del apuntador.
Para verificar un tipo de apuntador en C, puedes usar el operador unitario '*'. Por ejemplo, *ptr.
El "rvalue" de una variable es el valor alojado en esa dirección.
Direcciones invalidas y la dirección Null
En C, el valor NULL se usa para indicar que un puntero está vacío. Un puntero siempre está asociado a objetos de un tipo, por lo que solo puede apuntar a objetos (variables o vectores) de ese tipo.
Al inicializar un puntero en NULL, se garantiza que el puntero no apunte a una dirección inválida. Sin embargo, esto no define una variable referenciada.
Los punteros se deben inicializar, ya sea al declararlos o mediante una asignación. Un puntero puede inicializarse a 0, a NULL o a una dirección. Un puntero con valor 0 o NULL no apunta a nada.
Un apuntador nulo se utiliza para proporcionar a un programa un medio de conocer cuándo un apuntador contiene una dirección válida.
Es una buena práctica de programación inicializar el puntero a NULL en caso que no se sepa inmediatamente la dirección exacta a asignársele.
Apuntadores a apuntadores
Dado que un apuntador es una variable que apunta a otra, fácilmente se puede deducir que pueden existir apuntadores a apuntadores, y a su vez los segundos pueden apuntar a apuntadores, y así sucesivamente. Estos 4 apuntadores se declaran colocando tantos asteriscos (‘*’) como sea necesario.
Apuntadores constantes y apuntadores a constantes
Es posible declarar apuntadores constantes. De esta manera, no se permite la modificación de la dirección almacenada en el apuntador, pero sí se permite la modificación del valor al que apunta.
También es posible declarar apuntadores a datos constantes. Esto hace que no sea posible modificar el valor al que apunta el apuntador.
Apuntadores, arreglos y aritmética de apuntadores
Los arreglos y apuntadores están fuertemente relacionados. El nombre de un arreglo es simplemente un apuntador constante al inicio del arreglo. Se pueden direccionar arreglos como si fueran apuntadores y apuntadores como si fueran arreglos.
Es posible sumar y restar valores enteros a un apuntador. El resultado de estas operaciones es el desplazamiento de la dirección de memoria hacia adelante (suma) o hacia atrás (resta) por bloques de bytes del tamañoo del tipo de dato apuntado por el apuntador. Esto permite recorrer arreglos utilizando apuntadores.
También es posible restar dos apuntadores. El resultado de esta operación es el número de bloques de bytes que hay entre las dos direcciones del tamaño del tipo de dato apuntado por los apuntadores.
Apuntadores para pasos de parametros por referencia
El lenguaje C no provee una manera de pasar parámetros por referencia. Sin embargo, es posible hacerlo a través del uso de apuntadores. A continuación se muestra un ejemplo del paso de un parámetro por referencia en C++, y luego un código equivalente en C o C++ utilizando un apuntador:
void suma(int a, int b, int *r)
{
*r = a + b;
}
void main()
{
int x;
suma(7, 5, &x);
cout << "7 + 5 = " << x;
}
Asignacion dinamica de memoria en apuntadores
Los programas pueden crear variables globales o locales. Las variables declaradas globales en sus programas se almacenan en posiciones fijas de memoria, en la zona conocida como segmento de datos del programa, y todas las funciones pueden utilizar estas variables. Las variables locales se almacenan en la pila (stack) y existen sólo mientras están activas las funciones donde están declaradas. En ambos casos el espacio de almacenamiento se reserva en el momento de la compilación del programa.
También es posible reservar y utilizar memoria dinámicamente, tomada de la zona de memoria llamada montículo (heap) o almacén libre. En C están disponibles varias funciones que permiten realizar reservar y librerar memoria.
Para asignar memoria dinámicamente en C se utilizan las funciones malloc() y free(), definidas típicamente en el archivo de cabecera stdlib.h. La función malloc() reserva memoria y retorna su dirección, o retorna NULL en caso de no haber conseguido suficiente memoria; y la función free() permite liberar la memoria reservada a través de un apuntador. La sintaxis de ambas funciones es como sigue:
Código C y C++
void *malloc(size_t tam_bloque);
// size_t es un tipo de datos entero.
// tam_bloque es el tama~no en bytes
// del bloque de memoria a reservar.
void free(void *bloque); // bloque es un apuntador a la zona
// de memoria a liberar.
Como se puede apreciar, malloc() reserva memoria sin importar el tipo de datos que se almacenará en ella, retornando un apuntador a void. Por esta razón, se hace necesario convertir el tipo de apuntador al tipo del apuntador que guardará la dirección.
Bibliografia
https://learn.microsoft.com/es-es/cpp/cpp/pointers-cpp?view=msvc-170
https://utch2009.files.wordpress.com/2010/04/apuntadores.pdf
https://www.utm.mx/~mgarcia/PE7(Apuntadores).pdf
https://profmatiasgarcia.com.ar/uploads/tutoriales/Guia_para_manejo_de_punteros.pdf
Comentarios
Publicar un comentario