facebook cdr twitter cdr   instagram cdr
Miércoles, 08 November 2017 15:08

10. Punteros

Escrito por
Valora este artículo
(3 votos)

10.1 Punteros

¿Qué son los Punteros a Apuntadores?

1. Un puntero es una variable un tanto especial.
2. Con un puntero podemos almacenar direcciones de memoria.
3. En un puntero podemos tener guardada la dirección de una variable.

memory addresses

En la figura anterior tenemos una representación de lo que sería la memoria del ordenador. Cada casilla representa 1 byte de la memoria. Y cada número es su dirección de memoria. La primera casilla es la posición 000001 de la memoria. La segunda casilla la posición 000002 y así sucesivamente.

Supongamos que ahora declaramos una variable char:

char numero = '43';

El ordenador nos guardaría por ejemplo la posición 000003 para esta variable. Esta posición de la memoria queda reservada y ya no la puede usar nadie más. Además esta posición a partir de ahora se le llama numero. Como le hemos dado el valor 43 a numero, el valor 43 se almacena en numero, es decir, en la posición 000003.

El resultado sería:

Dirección de numero = 00003, valor de numero = 43

Esto deja en claro la diferencia entre el valor de una variable (43) y su dirección de memoria (00003) 

Nota: Las direcciones de memoria dependen de la arquitectura del ordenador y de la gestión que el Sistema Operativo haga de ella. En lenguaje ensamblador se debe indicar numéricamente la posición física de memoria en que queremos almacenar un dato. De ahí que este lenguaje dependa tanto de la máquina en la que se aplique. En C no debemos, ni podemos, indicar numéricamente la dirección de memoria, si no que utilizamos una etiqueta que conocemos como variable (en su día definimos las variables como direcciones de memoria). Lo que nos interesa es almacenar un dato, y no la localización exacta de ese dato en memoria.

10.2 Operadores de los punteros

  • Operador de dirección (&): Representa la dirección de memoria de la variable que le sigue: &fnum representa la dirección de memoria de fnum.
  • Operador de contenido o indirección (*): El operador * aplicado al nombre de un puntero indica el valor de la variable apuntada:

cap39

¿Cómo se declaran los punteros?

Hemos dicho que un puntero sirve para almacenar las direcciones de memoria. Muchas veces los punteros se usan para guardar las direcciones de variables. Ya vimos en la Unidad de Tipos de Datos que cada tipo de variable ocupaba un espacio distinto. Por eso cuando declaramos un puntero debemos especificar el tipo de datos cuya dirección almacenará.

Así que para declarar el puntero punt debemos hacer:

cap40

El asterisco (*) sirve para indicar que se trata de un puntero, debe ir justo antes del nombre de la variable, sin espacios. En la variable punt sólo se pueden guardar direcciones de memoria, no se pueden guardar datos. Vamos a recapitular paso a paso:

int numero;

Reservamos memoria para numero (supongamos que queda como antes, posición 000003). Por ahora numero no tiene ningún valor.

int *punt;

Reservamos una posición de memoria para almacenar el puntero. Lo normal es que según se declaran variables se guarden en posiciones contiguas. De modo que quedaría en la posición 000004. Por ahora punt no tiene ningún valor, es decir, no apunta a ninguna variable.

numero = 92;

Aquí ya estamos dando el valor 92 a numero. Se almacena 43 en la dirección 000003, que es la de numero.

punt = №

Por fin damos un valor a punt. El valor que le damos es la dirección de numero (ya hemos visto que & devuelve la dirección de una variable). Así que punt tendrá como valor la dirección de numero, 000003. Cuando un puntero tiene la dirección de una variable se dice que ese puntero apunta a esa variable.

Nota: La declaración de un puntero depende del tipo de dato al que queramos apuntar. En general la declaración es:

tipo_de_dato *nombre_del_puntero;

 10.3 Uso y funciones de los punteros

Los punteros tienen muchas utilidades, por ejemplo:

1. Permiten pasar argumentos (o parámetros) a una función y modificarlos.
2. Permiten el manejo de cadenas y de arrays.
3. Permiten acceder directamente a la pantalla, al teclado y a todos los componenetes del ordenador.

Pero si sólo sirvieran para almacenar direcciones de memoria no servirían para mucho. Nos deben dejar también la posibilidad de acceder a esas posiciones de memoria. Para acceder a ellas se usa el operador *, que no hay que confundir con el de la multiplicación.

Ejemplo: Puntero que apunta a un tipo de dato entero de la variable numero luego imprime su dirección de memoria y su valor.

cap41

 

Visto 168 veces Modificado por última vez en Martes, 05 December 2017 15:29
Alejandro Carreño

Desarrollador, Programador, Web Master y Community Manager de CDR Consultores

Deja un comentario

Asegúrese de introducir toda la información requerida, indicada por un asterisco (*). No se permite código HTML.

Tweets

RT @cdrconsultores: El equipo de CDR Consultores les desea una Feliz Navidad!! https://t.co/kUjY5FsI3O
El equipo de CDR Consultores les desea una Feliz Navidad!! https://t.co/kUjY5FsI3O

Productos

Servicios

servicios off
website off
desarrollo off
formacion off
negocios off

Publicaciones

« Enero 2018 »
Lun Mar Mier Jue Vie Sáb Dom
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

Facebook

end-logo

 

Nestor M. Carreño T. - Todos los Derechos Reservados
Rescindir de Dios y de los valores morales, lleva no sólo al empobrecimiento espiritual, sino también al empobrecimiento material
Gracias a Usted, Muchas Gracias por Consultarnos, Dios le Bendiga!

Diseño y Desarrollo Nestor M. Carreño T. - CDR Consultores, C.A.