Está en la página 1de 24

Programacin Avanzada y Mtodos Numricos

Previo 2: Apuntadores
Apuntadores a tipos de datos primitivos, compuestos y funciones
Memoria dinmica
Parmetros de la lnea de comandos

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 1


Apuntadores 1
EN ESTA SECCIN

Qu es un apuntador?
Declaracin de apuntadores
Operadores de apuntador
Objetivos de los apuntadores
Apuntador a un arreglo
unidimensional
Apuntador a un arreglo
multidimensioal
Apuntador a una funcin
Apuntadores
Un apuntador es una variable que guarda la direccin de
memoria de un objeto en C.

En el lenguaje C existen apuntadores para todo tipo de


objetos: enteros, reales, estructuras, uniones e incluso,
funciones y otros apuntadores.

Los apuntadores son la caracterstica ms poderosa del


lenguaje ya que permiten manejar de manera directa la
memoria del sistema.

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 3


Declaracin de un Un apuntador almacena direcciones, no
apuntador enteros, no reales, no caracteres, etc.
Para declarar un apuntador es
necesario indicar:

1. Tipo de dato al que apunta

2. Operador * que indica que


se est declarando un
apuntador
La variable ap podr guardar direcciones
3. Nombre del apuntador
de (apuntar a) variables de tipo char.
NOTA El trmino apuntar
significa guardar la direccin A diferencia de las variables
de
convencionales, puede ser void.
2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 4
Mapa de memoria En un compilador moderno (no turbo C),
un apuntador requiere de 4 Bytes de
memoria para ser almacenado.
Observe:
1. La variable ap de tipo
apuntador se encuentra en
la direccin de memoria
0x258

2. La variable c de tipo char


se encuentra en la
direccin 0x320

3. El contenido de ap es igual
a la direccin de memoria
de c

Por tanto, ap apunta a c


2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 5
Declaracin de un apuntador
Tomando en cuenta la siguiente declaracin:
void * ap = NULL;

Un apuntador no puede inicializarse a otro valor que no sea


NULL.

Investigue qu es NULL y cul es su valor.

A diferencia de las variables convencionales un apuntador


puede contener en su declaracin void, que indica que es
capaz de almacenar la direccin de memoria de cualquier
objeto de C, sin importar su tipo.

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 6


Operadores de apuntador
Existen dos operadores especiales para trabajar con
apuntadores:

& : Operador de direccin o de referencia


* : Operador de indireccin o de desreferencia

Los apuntadores almacenan direcciones que son nmeros en


base 16, sin embargo, a un apuntador slo se le puede
aplicar la operacin de suma y/o resta.

Investigue a qu se refiere sizeof.


2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 7
lgebra de apuntadores
El lgebra de apuntadores ayuda a comprender el porqu del
funcionamiento caracterstico de los apuntadores.

Existe una estrecha relacin entre los arreglos y los apuntadores.

Investigue qu es el lgebra de apuntadores y cmo


funciona.

Por qu es importante definir el tipo de dato al que se va a


apuntar?

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 8


Objetivos de los apuntadores
Los apuntadores fueron creados para que el programador pueda
tener acceso directo a la memoria:

Pasar parmetros a las funciones por referencia y no por valor.

Permitir que una funcin devuelva como resultado un arreglo de n


dimensiones.

Crear tipos de datos auto referenciados que permitan la construccin de


estructuras de datos.

Ejecutar una funcin invocndola con su direccin de memoria.

Pasar una funcin como parmetro a otra funcin.

Crear funciones que permitan inicializar valores.

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 9


Apuntadores a tipos complejos
En C es posible definir apuntadores a cualquier tipo de
objeto. El apuntador ms sencillo es aquel que apunta a un
tipo primitivo.

Existen apuntadores a tipos de datos complejos, como:

Arreglo de 1 dimensin
Arreglo de 2 o ms dimensiones
Estructuras
Apuntadores
Funciones

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 10


Apuntador a arreglo El nombre de un arreglo hace referencia a
de una dimensin la direccin de memoria del primer
elemento.
Declarar un apuntador a un
arreglo de una dimensin es
como declarar un apuntador a
un tipo de dato primitivo:

1. Declarar el arreglo

2. Declarar un apuntador que


pueda guardar direcciones
de memoria del tipo de
dato del arreglo

3. Igualar el apuntador al
arreglo

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 11


Apuntador a un No confundir un apuntador doble (**) con
arreglo un apuntador a una matriz.
multdimensional

1. Declarar el arreglo

2. Declarar un apuntador que


pueda guardar direcciones
de un arreglo de N
elementos del tipo del
arreglo creado
anteriormente (O.o)

3. Apuntar al arreglo

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 12


Apuntador a arreglo multidimensional
En este caso, el compilador sabe que cada 2 columnas
representan un nuevo rengln.

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 13


Apuntador a una Una funcin tambin es un objeto, por
funcin tanto tiene direccin, memoria y
contenido.
Declarar un apuntador a una
funcin resulta bastante
sencillo:

1. Declarar una funcin

2. Declarar un apuntador
como se muestra

3. Igualar el apuntador a la
direccin de memoria de la
funcin

4. Invocar la funcin con el


apuntador
2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 14
Apuntador a una funcin

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 15


Memoria dinmica 2
Memoria dinmica
Al proceso de obtener del S.O. memoria extra durante el
tiempo de ejecucin del programa se le conoce como
memoria dinmica.

Uno de los usos ms comunes de los apuntadores es reservar


memoria en tiempo de ejecucin.

En C existe la funcin malloc() para este fin.

Investigue en qu librera est, as como el prototipo de la


funcin.

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 17


Ejemplo: Memoria dinmica

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 18


Parmetros de la lnea de comandos
3
La funcin main()
La funcin main() tiene varios prototipos vlidos:

int main(){} : por defecto

void main(){}

main(){} : equivalente a la primera

As como puede cambiar el tipo de retorno de la funcin,


tambin puede recibir parmetros a travs de la lnea de
comandos.

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 20


Parmetros de main()
Las firmas de la funcin con parmetros son:

int main(int argc, char **argv){}

void main(int argc, char **argv){}

main(int argc, char **argv){}

Donde :
argc: Nmero de parmetros que recibe.
argv: Arreglo de cadenas con todos los parmetros recibidos. Cabe
mencionar que argv[0] es el nombre del programa.

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 21


Ejemplo: Memoria dinmica

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 22


Ejecucin y salida del programa

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 23


Prxima sesin
Procesamiento de archivos
Archivos de texto
Archivos binarios

2012-2 Eric Ulises Garca Cano Castillo - gcc@unica.unam.mx 24

También podría gustarte