Sei sulla pagina 1di 35

PUNTEROS I

by Adolfo Jimnez
2013

Introduccin

La memoria de un ordenador est compuesta por


unidades bsicas llamadas bits.
Cada bit slo puede tomar dos valores.
Normalmente denominados alto y bajo, 1 y 0.
Cada grupo de 8 bits forma un byte u octeto.
Para acceder a los bits hay que acceder antes a los bytes.
Cada byte de la memoria de un ordenador tiene una
direccin, llamada direccin de memoria.

Introduccin

Los microprocesadores trabajan con una unidad bsica de


informacin, a la que se denomina palabra (en ingls
word).
una palabra puede estar compuesta por uno, dos, cuatro,
ocho o diecisis bytes.
Hablaremos en estos casos de plataformas de 8, 16, 32, 64
128 bits.
Cada direccin de memoria contiene siempre un byte.
Lo que suceder cuando las palabras sean, por ejemplo,
de 32 bits es que accederemos a posiciones de memoria
que sern mltiplos de 4.

Introduccin

Si para almacenar un objeto se precisan


cuatro bytes, y la direccin de memoria de
la primera posicin es n, el objeto
ocupar las posiciones desde n a n+3, y la
direccin del objeto ser, tambin, n.

Podemos saber qu tipo de plataforma estamos


usando averiguando el tamao del tipo int, y para ello
hay que usar el operador sizeof, por ejemplo:

Explicacin

Supongamos que las casillas de memoria estn numeradas


segn su posicin en la memoria. La primera tiene la
direccin 0, la segunda la direccin 1, la tercera la
direccin 2 y as sucesivamente. Nosotros le solicitamos
al ordenador una casilla en la que poder meter nuestros
datos; entonces el ordenador busca una casilla libre y nos
entrega una ficha con el nmero de casilla, es decir, su
direccin en la memoria.

Explicacin

El lenguaje de programacin nos permite asociar esta


direccin a un nombre de variable ya que el ordenador
slo entiende de direcciones numricas. Nosotros ahora
podemos consultar en cualquier momento el contenido
de nuestra casilla, o cambiar su contenido, ya que
tenemos la reserva y la ficha con la direccin de la casilla.

Qu es un puntero?

Un puntero es una casilla especial que en vez de contener


datos directamente, contiene una direccin de alguna
casilla que contiene datos. En la Figura tenemos un
ejemplo de un puntero (casilla azul) que contiene la
direccin de una casilla tipo carcter que contiene la letra
A.
char* letra;

Qu es un puntero?

Vamos a crear una variable que contenga una letra y


asignar a un puntero la direccin de la casilla que
contiene la letra.
Esto se hace mediante el operador &. El operador &
delante de cualquier variable nos devuelve su direccin,
en vez de su contenido.
char otraLetra = 'A';
char* letra = &otraLetra;

Qu es un puntero?

Los punteros son variables pero, que en vez de tener un


valor especfico, contienen las direcciones de las variables
a las que apuntan.

Sintaxis:

<tipo> *<identificador>

<tipo>: Tipo de dato del objeto referenciado por el puntero.


<identificador>: Identificador de la variable de tipo puntero.

Por lo tanto

Cuando se declara un puntero se reserva memoria para


albergar una direccin de memoria, pero NO PARA
ALMACENAR EL DATO AL QUE APUNTA EL PUNTERO.

p es un puntero hacia (que apunta) enteros. El valor *p es


un entero almacenado en una direccin.

Inicializando valores

Despus de declarar un puntero es preciso darle un valor


(inicializarlo):

OPERADOR DE DIRECCION: &

La direccin ocupada por una variable se calcula con el


operador de direccin &.

Viendo la direccin

Ejemplo de impresin de la direccin de la variable edad:

El operador de direccin se puede utilizar para inicializar


y asignar valores a variables punteros; tal como la
diapositiva 9.

Viendo la direccin

Ejemplo:

Viendo la direccin

Imprimiendo los valores de p y edad:

Salida:

Repazando:

int *puntero; // Declara un puntero a una variab tipo int.


int variable; /* Declara una variable tipo int. El
compilador identifica y asigna direccin (supongamos
0x2710, en Hexadecimal) al identificador variable */
variable = 123456; /* Almacena en las direcciones
0x2710, 0x2711, 0x2712 y 0x2713 el valor 123456,
tomando en cuenta que una variable de tipo int ocupa 4
bytes. */
puntero = &variable; // Almacena 0x2710 en puntero.

Cul es el resultado?

Ejemplo de acceso a la variable apuntada:

Operador de indereccin: *

El operador de indireccin es la expresin *ptr y significa el


valor de la variable apuntada por el puntero:

int *ptr;
*ptr = 35;

// declaracin
// indireccin

El direccionamiento indirecto consiste en utilizar el


operador de indireccin para acceder al valor
almacenado en una direccin:

Ejemplos:

Arrays y punteros

En C++ el nombre de un array es equivalente a la


direccin del primer elemento de dicho array. As:
int s[50];
equivale a
&s[0]
s[0]

s[1]

s[2]

s[3]

s[49]

Un puntero apunta a un array cuando apunta al


primer elemento del array:
a
100
a[0], p[0], *q
q
-25

a[1],

q[1]

75

a[2],

q[2]

-50

a[3],

q[3]

40

a[4],

q[4]

Arrays y punteros

La variable puntero q apunta al primer elemento del array


a; se puede utilizar cualquier a o q para nombrar los
elementos del array. El primer elemento del array se
puede referenciar como:

a[0], q[0], o bien *q.

Los restantes cuatro elementos se pueden referir como:


a[1] a a[4]
o bien q[1] a q[4].

Arrays y punteros

Ejemplo:

Aritmtica de punteros

C++ permite aadir un entero a un puntero en la tcnica


que se denomina aritmtica de punteros. Supongamos la
declareacin del array a:
int a [10];

Las siguientes declaraciones son equivalentes:

a + i = &a[ i ] (= significa equivale a )

Y si tenemos en cuenta los contenidos de las direcciones:


*a equivale a[0]
*(a+i) equivale a
a[i]

Aritmtica de punteros

Es decir, si p es una variable puntero que apunta a un


elemento array, p apunta al elemento 0 del array, p+1
apunta al elemento 1, p+2 apunta al elemento 2, etc.

*(p 2),

p[ -2 ]

*(p 1),

p[ -1 ]

*p

p[ 0 ]

*(p + 1),

p[ 1 ]

*(p + 2),

p[ 2 ]

Aritmtica de punteros

Los operadores de asignacin += y -= tambin se pueden


utilizar con punteros. As:
p += 5;
equivale a
p = p + 5;

Y ambas sentencias mueven el valor de p hacia


adelante en 5 elementos, en el array
correspondiente, es decir, p apunta a una direccin
distinta.
Los operadores de incremento (++) y de
decremento (--) trabajan con punteros igual que
con nmeros.

Aritmtica de punteros

Salida:

Qu imprime el siguiente cdigo?

Y, cul ser la direccin de memoria de d, si la direccin


de memoria de la variable c es 0x22ff80?

Qu imprime el siguiente cdigo?

Si la direccin de la variable x es 0x22FF3C.

Qu imprime el siguiente cdigo?

Qu imprime el siguiente cdigo?

Qu imprime el siguiente cdigo?

Si la direccin de la variable y es 22FF38.

Qu imprime el siguiente cdigo?

Asignacin dinmica de memoria

Los operadores new y delete se utilizan para reservar y


liberar memoria dinmicamente. new y delete son parte
del lenguaje C++ y no parte de una librera como suceda
con las funciones equivalentes malloc() y free() de C.
El propsito de new es crear arrays cuyo tamao pueda
ser determinado mientras el programa se ejecuta.
delete funciona igual que free() en C. La memoria a la
que apunta el puntero es liberado, pero no el puntero en
s.

Asignacin dinmica de memoria

A continuacin se presenta a modo de ejemplo un


programa que reserva memoria de modo dinmico para
un vector de caracteres:

Potrebbero piacerti anche