Está en la página 1de 7

4.

- Apuntadores (Punteros) Concepto

Introducción:

En el momento en el cual se declara una variable, el Sistema Operativo reserva un espacio


de la memoria RAM de la computadora para almacenar información, el tamaño de este
espacio depende del tipo de variable que se esté declarando, ya que, como se vio
anteriormente, los distintos tipos de variable con que cuenta el Lenguaje C tienen diferentes
tamaños.

En ocasiones el programador necesitará además de saber la dirección de memoria (es decir


en que parte de la memoria RAM se encuentra almacenada la variable declarada), guardar
la dirección de memoria de una variable.

Las direcciones de memoria de una variable deben almacenarse en otras variables


llamadas punteros o apuntadores.

Apuntadores:

Antes de explicarte lo que es un apuntador es necesario que sepas qué es la dirección de


memoria de una variable, ya que es indispensable para comprender el funcionamiento de
un apundador.

 Dirección de memoria de una variable:

La dirección de memoria de una variable es el lugar exacto en donde se encuentra


almacenada (guardada) la información de una variable en la memoria RAM de la
computadora. Esta dirección es un número escrito en el sistema de numeración
hexadecimal, por ejemplo, los números: 0022FF74 y 0011FA12 son direcciones de
memoria de dos variables.

Al momento de declarar una variable, el preprocesador y el SO son los encargados de


asignar el lugar en la memoria RAM de la computadora para almacenar la información de
la variable, el lugar asignado depende del espacio disponible.

Se te muestra un ejemplo de la representación de la memoria RAM.

Cada casilla representa una dirección de memoria compuesta por un byte (8 bits) y cada
número de la izquierda es su dirección de memoria.

La primera casilla es la posición 00001 de la memoria.

La segunda casilla la posición 00002 y así sucesivamente.


Ejemplo:

Supón que ahora se declara una variable de tipo char: llamada numero, a la cual se le
asigna un valor de cuarenta y tres, de esta forma:

Int numero =43;

El contenido de esta variable se guardara en la posición 00003 de la memoria RAM y ya no


puede ser asignada a otra variable porque queda reservada.

Observa la siguiente imagen, en ella se representa esto que se te acaba de explicar:

Para saber cuál es la dirección de memoria de una variable puedes utilizar el operador
dirección de (&), el cual devuelve la dirección de memoria de su operando (es decir la
variable de la que se desea obtener la dirección).

Para aclarar esto enseguida se te muestra un ejemplo del código fuente necesario para
obtener la dirección de memoria de una variable y mostrarla en pantalla.

#include <stdio.h>

#include <windows.h>

int main()

int numero = 43;

printf( "Dirección de numero = %p, valor de numero = %i\n", &numero, numero );

system ("PAUSE");

}
El resultado de editar, depurar y compilar este código fuente es el siguiente:

Explicación:

La primera línea de código escrita después de la declaración y definición de la función


principal del programa, declara una variable de tipo entero llamada numero, a la cual se le
asigna el valor de cuarenta y tres.

Enseguida se encuentra escrita la siguiente línea de código:

printf( "Dirección de numero = %p, valor de numero = %i\n", &numero, numero );

La función printf() se encarga de mostrar en pantalla tanto la dirección como el contenido


de la variable llamada numero, recuerda que no es lo mismo la dirección de la variable, que
en este caso es: 0022FF44 y el contenido de la variable (la información que almacena), que
en este caso es el numero 43.

Observa el siguiente fragmento de la línea de código anterior:

&numero, numero );

En él puedes observar la implementación del operador dirección de (&), al colocar delante


de este operador el nombre de la variable número, éste operador devolverá la dirección de
memoria de esta variable, la función printf() recibe el valor devuelto por el operador dirección
de (& y posteriormente )se encarga de mostrar en pantalla esta dirección. Después muestra
el contenido de la variable llamada número.

Observa que dentro de la función printf() se colocó el modificador de formato %p, el cual
sirve para mostrar direcciones de memoria por pantalla.

Ahora que sabes lo que es una dirección de memoria, se te explicara lo que son los
apuntadores:

Un apuntador es una variable capaz de almacenar la dirección de memoria de una variable.

Nota: El apuntador almacena la dirección de memoria de una variable, no


el contenido de la variable.
La sintaxis para declarar un apuntador es la siguiente:

tipo *nombre;

Tipo: es cualquier tipo de variable, por ejemplo char, int, float o doublé. Depende del tipo de
datos de la variable de la cual se pretenda almacenar su dirección de memoria. Por ejemplo
si se desea almacenar la dirección de una variable de tipo char, el apuntador que almacene
la dirección de esta variable debe ser también de tipo char.

*: El operador asterisco indica la declaración de un apuntador, se escribe antes del nombre


del apuntador sin espacios en blanco.

Nombre: corresponde al nombre del apuntador, este nombre obedece a las mismas reglas
que el nombre de una variable o el de una constante.

Los apuntadores tienen otras utilidades, por ejemplo:

 Nos permiten pasar argumentos (o parámetros) a una función y modificarlos.


 También permiten el manejo de cadenas de caracteres y de arreglos.
 Otro uso importante es que permiten acceder directamente a la pantalla, al
teclado y a todo el hardware de la computadora,
 Permiten también la posibilidad de acceder (leer o modificar) a esas
posiciones de memoria.

Nota: Para acceder a la información almacenada en una dirección de memoria


a través de un apuntador, se usa el operador asterisco (*), debe escribirse
antes del nombre del apuntador sin espacios en blanco, este operador no se
debe confundir con el operador de la multiplicación.

A continuación se te muestra un código fuente en el que se utilizan apuntadores, analízalo:


#include <stdio.h>

#include <windows.h>

int main()

int numero = 43;

int *punt; /*Declaración del apuntador*/

punt = &numero; /*Almacenamos la dirección en el puntero*/

printf( "Dirección de numero = %p, valor de numero = %i\n", &numero, numero );

*punt = 30; /*Guardamos 30 en la dirección de memoria que guarda el apuntador*/

printf( "Direccion de numero = %p, valor de numero = %i\n", &numero, numero );

system ("PAUSE");

El resultado de editar, depurar y compilar este código fuente es el siguiente:

Explicación:

En la primer línea de código, después de la declaración y definición de la función de este


programa (la función main()) se declaró una variable llamada numero de tipo entero a la
cual se le asigna el valor de cuarenta y tres.

Enseguida se encuentra la línea de código siguiente:

int *punt;

Con esta línea de código se declara un apuntador llamado punt capaz de almacenar la
dirección de memoria de una variable de tipo entero.
Enseguida se encuentra escrita la siguiente línea de código:

punt = &numero;

El operador dirección de (&) devuelve la dirección de memoria de la variable llamada


número, este valor devuelto se asigna (guarda) en el apuntador llamado punt.

Observa que en esta asignación no se utilizó al operador asterisco ( * ).

En este momento se dice que punt “apunta” a la variable número ya que almacena su
dirección de memoria.

Enseguida la función printf( ) se encarga de mostrar en pantalla, tanto la dirección de


memoria de la variable número como su contenido, que en este caso son: 0022FF74 y 43
respectivamente.

Después está escrita la siguiente línea de código:

*punt = 30;

Con esta línea de código se guarda el valor de treinta dentro de la dirección de memoria
que almacena el apuntador punt, es decir, dentro de número, se está accediendo a la
variable número sin “tocarla”, es decir, sin realizar una asignación directa, por ejemplo:
numero =30; gracias al apuntador punt se está modificando el contenido de una variable
sin utilizar su nombre directamente.

El cuarenta y tres que se había guardado previamente en esta misma variable fue
reemplazado y en su lugar se guardó un treinta.

Para corroborar que las líneas de la explicación anterior son ciertas por medio de la función
printf() se volvió a mostrar por pantalla tanto la dirección de memoria de numero como su
nuevo contenido.

Puedes observar que la dirección de memoria no cambio, esto es porque se trata de la


misma variable, pero el contenido que almacenaba número si cambio (por medio del
apuntador).
Conclusión.

Un apuntador es una variable capaz de almacenar la dirección


de memoria de otra variable, cuando un apuntador almacena
una dirección de memoria se dice que éste apunta a la variable
de la cual almacena su dirección, por medio de un apuntador
es posible acceder a los datos almacenados en una dirección
de memoria (leerlos o modificarlos).

¡Muy bien, continua con tus temas!

También podría gustarte