Vous êtes sur la page 1sur 4

Programacin I 2010

Apuntadores - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 1
Funciones
Apuntadores
M.C. Yalu Galicia Hdez. (FCC/BUAP) 1
Unidad 4
Apuntadores v.s. Variables
2
Una variable contiene de manera directa un valor
especfico.
Un apuntador contiene la direccin de una variable
que contiene un valor especfico.
En este sentido, una variable hace referencia directa
a un valor y un apuntador hace referencia indirecta.
Hacer referencia a un valor a travs de un apuntador
se le conoce como indireccin.
Variable v.s. apuntador
3
7
contador
La variable
Contador hace
referencia al 7 de
manera directa
7
contador
El apuntador
apCont hace
referencia al 7 de
manera indirecta
apCont
Apuntadores
4
Un apuntador como cualquier otra variable , se
debe declarar antes de ser utilizado, de la siguiente
forma:
int *apCont;
Esta declaracin, declara una variable apCont de
tipo int * , es decir, un apuntador a un valor de tipo
int y se lee: apCont es un apuntador a int o
apCont apunta a un objeto de tipo int.
Un * en la
declaracin indica
un apuntador!!
Operadores para apuntadores
5
El operador direccin (&), devuelve la direccin de
memoria de su operando. Por ejemplo, si declaramos:
int y = 5, *apY;
La siguiente instruccin asigna la direccin de la
variable y, al apuntador apY.
apY = &y;
Entonces se dice que apY apunta a y.
5
y apY
apY = &y
Operadores para apuntadores
6
El operador de indireccin o desreferencia (*),
devuelve el contenido de lo apuntado por el
apuntador.
Es decir, si el apuntador apunta a una variable, al
desrefereciar se obtiene el valor de la variable, no el
del apuntador.
5
y apY
En el ejemplo, si se imprime
printf(%d, *apY);
tendramos en pantalla
5
Programacin I 2010
Apuntadores - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 2
Ejemplo
7
//uso de operadores & y *
#include <stdio.h>
int main( ) {
int a; // a es un entero
int *apA; // apA es un apuntador a un entero
a = 7;
apA = &a; // a apA se le asigna la direccin de la variable a
printf(La direccin de a es: %d\n, &a );
printf( El valor de apA es: %d\n, apA);
printf( El valor de a es: %d\n, a);
printf( El valor de *apA es: %d\n, *apA);
printf( Muestra de que * y & son inversos uno del otro \n);
printf(&*apA = %d\n, &*apA );
printf(*&apA = %d\n, *&apA );
}
8
OJO
Supongan que declaramos las siguientes variables:
int y = 10;
int *apY;
Si ahora hacemos:
printf(%d, *apy);
Que imprimir?
10
y apY
A dnde
apunta apY
Aputadores y arreglos
9
Los arreglos y los apuntadores se relacionan
intimamente en C y se pueden utilizar casi de modo
intercambiable.
Un nombre de arreglo se puede representar como
un apuntador
Es decir, por definicin, consideraremos el nombre de
un arreglo como una direccin (apuntador).
Los apuntadores se pueden utilizar para hacer
cualquier operacin que involucre subndices de
arreglos.
Aputadores y arreglos
10
Supongamos las siguientes declaraciones:
int b[4];
int *apB;
Debido a que el nombre de un arreglo es un
apuntador, se puede hacer
apB = b;
O bien, con la instruccin equivalente
apB = &b[0];
b[0] b[1] b[2] b[3]
apB
b
Aritmtica de apuntadores
11
En C, es posible realizar operaciones aritmticas
con apuntadores .
Un apuntador se puede
Incrementar (++)
Decrementar (--)
Se puede sumar un entero a un apuntador (+ o +=)
Se puede restar un entero a un apuntador (- o -=)
Se puede restar un apuntador a otro.
Ejemplo
12
Supongamos que tenemos el vector b y el
apuntador apB declarados e inicializados de la
siguiente forma.
int b[4];
int *apB = &b[0];
La instruccin apB++; produce que apB se mueva a
la siguiente localidad, es decir a b[1];
La instruccin apB += 2; produce que apB, se
mueva 2 localidades ms, es decir, al elemento b[3];
3 2 1 5
b[0] b[1] b[2] b[3]
apB b
Programacin I 2010
Apuntadores - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 3
Ejemplo
13
Si queremos obtener el valor del elemento apuntado
por el apuntador apB, simplemente utilizamos el
operador de desreferenciado (*)
int *apB = &b[0];
apB++;
int x;
x = *apB;
El valor de x es igual a 2, exactamente igual que si
hubieramos hecho x = b[1];
3 2 1 5
b[0] b[1] b[2] b[3]
apB b
Apuntadores y arreglos
14
La relacin estrecha que existe entre apuntadores y arreglos, nos
permite pasar como parametro de entrada en funciones, un
apuntador a algn tipop y utilizar este dentro de la fucin como un
arreglo comn y corriente
Ejemplo:
int main ()
{
int v[10];
Leervector(v);
EscribirVector(v);
}
void LeerVector( int *a) { //el vector pasa como apuntador a entero
for (int i=0; i<10; i++)
cin >> a[i]; //se utiliza normalmente como vector!!
}
Actividad colaborativa
M.C. Yalu Galicia Hdez. (FCC/BUAP) 15
Realice el anlisis y el programa en C, para la funcin
cuentaRepeticiones, que recibe una cadena de caracteres
y un carcter cualquiera y regresa el nmero de veces que
se repite ese carcter en la cadena.
Utiliza un apuntador como parmetro de entrada
En lugar de subindices, utiliza el apuntador para moverte
dentro del arreglo.
Ejemplo:
cadena: anitalava y caracter = a
Nmero de ocurrencias: 4
16
Actividad grupal (SOLUCION)
Compartiendo la experiencia
Memoria dinmica
17
Para evitar errores fatales, un apuntador siempre debe
ser asignado a la direccin de una variable (usando el
operador &) u obtener memoria dinmica.
Esto es, memoria asignada en tiempo de ejecucin.
Las funciones malloc() y free() proveen un medio para
obtener memoria dinmicamente.
La funcin malloc es seguido por el nmero de
elementos, del tipo de dato del que se quiere obtener
memoria, de tal forma que el compilador pueda saber
automticamente la cantidad en bytes que se solicita.
malloc (sizeof(int));
Ejemplo
18
Ejemplo:
malloc (sizeof(int)); //requiere 4 bytes
malloc (sizeof(int)*N); //un arreglo de N enteros (N*4 bytes)
malloc (sizeof(float)); //requiere 8 bytes
El valor regresado por malloc es una direccin de
memoria que debe ser asignada a un apuntador.
Ejemplo:
int *ap = malloc(sizeof(int));
*ap= 15;
2000
15
2001
2002
2003
Celdas de
memoria
ap
Programacin I 2010
Apuntadores - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 4
Memoria dinmica
19
OJO: La nica forma de acceder a la localidad de
memoria solicitada es a travs del apuntador, si se
reasigna otra direccin a este, la localidad anterior ser
inalcanzable y no podremos recuperar su contenido.
Si malloc no puede encontrar memoria suficiente,
devuelve un apuntador a 0 (o NULL). Esta condicin
debe ser manejada adecuadamente
La liberacin del espacio ocupado por un dato (que
solicit memoria con malloc()), se efecta mediante el
operador free.
free(apA); // donde apA es un apuntador
Qu hemos aprendido?
M.C. Yalu Galicia Hdez. (FCC/BUAP) 20

Vous aimerez peut-être aussi