Sunteți pe pagina 1din 35

Evaluacin escrita Evaluacin escrita

Indique como se realiza la declaracin y la Indique como se realiza la declaracin y la


llamada a una funcin
Indique como se declara y asigna valores a un Indique como se declara y asigna valores a un
array
Describa las ventajas de usar estructuras y como se
declaran
Ejercicios Ejercicios
Elabore un programa que lea una cadena de 50 Elabore un programa que lea una cadena de 50
caracteres y convierta las vocales en maysculas
Elabore un programa que obtenga el determinante Elabore un programa que obtenga el determinante
de una matriz 3x3 ingresada por el usuario
PUNTEROS PUNTEROS
(APUNTADORES) ( )
Sugerencias y herramientas para crear para crear y presentar diapositivas en
formato panormico
Contenido Contenido
Direcciones en memoria
Aritmtica de punteros
Concepto de puntero
(apuntador)
P t ll id
p
Punteros constantes frente
a punteros a constantes
Puntero null y void
Punteros a punteros
Punteros a Arrays
Punteros como argumento
de funciones
Punteros a funciones
Punteros a Arrays
Arrays de punteros
Punteros a cadenas
Punteros a funciones
Punteros a estructuras
Ejercicios
Punteros a cadenas
j
Direccin de memoria Direccin de memoria
Cuando una variable se declara, se asocian tres ,
atributos fundamentales con la misma: su nombre, su
tipo y su direccin de memoria
Int n;
Asocia al nombre n, el tipo int y la direccin de alguna p y g
posicin de memoria donde se almacena el valor de n
Cont Cont
Al valor de la variable se accede por medio de su p
nombre. Por ejemplo, se puede imprimir el valor de n
con la sentencia;
Printf (%d,n);
A la direccin de la variable se accede por medio del
operador de direccin &. Por ejemplo, se puede
imprimir la direccin de n con la sentencia:
P i tf (% & ) Printf (%p,&n);
Ejemplo 10 1 Ejemplo 10.1
Obtener el valor y la direccin de una variable
# l d d h #include <stdio.h>
#include <stdlib.h>
int main ()
{ {
int n=75;
printf("n=%d\n",n);
printf("&n=%p\n" &n); printf( &n=%p\n ,&n);
system("pause");
return 0;
}}
Concepto de puntero (apuntador) Concepto de puntero (apuntador)
Un puntero es una variable que contiene una direccin de memoria
El tipo de variable que almacena una direccin se denomina puntero
Los punteros se rigen por estas reglas bsicas:
Un puntero es una variable como cualquier otra; Un puntero es una variable como cualquier otra;
Una variable puntero contiene una direccin que apunta a otra posicin
en memoria
En esa posicin se almacenan los datos a los que apunta el puntero En esa posicin se almacenan los datos a los que apunta el puntero
Un puntero apunta a una variable de memoria
Ejemplo 10 2 Ejemplo 10.2
#include <stdio.h>
#i l d < dlib h> #include <stdlib.h>
int main ()
{
i 75 int n=75;
int*p=&n;
printf("n=%d, &n=%p, p=%p\n",n,&n,p);
i tf("& % \ " & ) printf("&p=%p\n",&p);
system("PAUSE");
return 0;
} }
Declaracin de punteros Declaracin de punteros
Al igual que cualquier variable, las variables punteros g q q , p
han de ser declaradas antes de utilizarlas. La
declaracin de una variable puntero debe indicar al
compilador el tipo de dato al que apunta el puntero;
para ello se hace preceder a su nombre con un
asterisco (*) asterisco (*)
<tipo de dato apuntado>*<identificador de puntero>
Fl t*f Float*f;
Inicializacin de punteros Inicializacin de punteros
La inicializacin de un puntero proporciona a ese puntero la
direccin del dato correspondiente. Para asignar una
direccin de memoria a un puntero se utiliza el operador de
referencia &.
&valor
Int i;
Int *p;
P=&i; /*asigna la direccin de i a p*/
*p=50; /*asigna un valor a la direccin de memoria*/ p 50; / asigna un valor a la direccin de memoria /
Indireccion de punteros Indireccion de punteros
El uso de un puntero
#include <stdio.h>
#include <stdlib h> El uso de un puntero
para obtener el valor
al que apunta es decir
#include <stdlib.h>
char c;
int main()
{
al que apunta, es decir,
su dato apuntado se
denomina indireccionar
char *pc;
pc=&c;
for(c='A';c<='Z';c++)
printf("%c",*pc);
denomina indireccionar
el puntero
printf("\n");
system("pause");
return 0;
} }
Punteros null y void Punteros null y void
Un puntero nulo no apunta a ninguna parte, no direcciona ningn dato
lid i valido en memoria
#define NULL 0
Otra forma de declarar un puntero nulo es asignar un valor de 0
Int *ptr=0;
Los punteros nulos se utilizan con frecuencia en programas con arrays de
punteros
En C se puede declarar un puntero de modo que apunte a cualquier tipo
de dato, es decir, no se asigna a un tipo de dato especifico. El mtodo es
declarar el puntero como puntero void* denominado puntero genrico
Void *prt
Punteros a punteros Punteros a punteros
Un puntero puede apuntar a otra variable puntero. Este Un puntero puede apuntar a otra variable puntero. Este
concepto se utiliza con mucha frecuencia en programas
complejos de C. para declarar un puntero a un puntero p j p p p
se hace preceder a la variable con dos asteriscos (**)
Int valor e=100; _ ;
Int *ptr1=&valor_e;
Int **ptr5=&ptr1; Int ptr5 &ptr1;
Punteros y Arrays Punteros y Arrays
Se pueden direccionar arrays como si fueran p y
punteros y punteros como si fueran arrays. La
posibilidad de almacenar y acceder a punteros y
arrays, implica que se pueden almacenar cadenas
de datos en elementos de arrays. Sin punteros eso
no es posible, ya que no existe el tipo de dato
cadena en C. no existen variables de cadena,
i d d nicamente constantes de cadena
Nombres de arrays como punteros Nombres de arrays como punteros
Un nombre de un array es simplemente un puntero.
Supongamos que se tiene la siguiente declaracin de un
array:
In lista[5]={10 20 30 40 50} In lista[5]={10,20,30,40,50}
Si se manda a visualizar lista[0] se vera 10 y si se manda a
visualizar *lista. Como un nombre de un array es un puntero,
0 tambin se vera 10
Dado que un nombre de un array contiene la direccin del
primer elemento del array se debe indireccionar el puntero primer elemento del array, se debe indireccionar el puntero
para obtener el valor del elemento
Arrays de punteros Arrays de punteros
Si se necesita reservar muchos punteros a muchos p
valores diferentes, se puede declara un array de
punteros. Un array de punteros es un array que
contiene como elementos punteros, cada uno de los
cuales apunta a un tipo de dato especifico. La linea
siguiente reserva un array de diez variables puntero a siguiente reserva un array de diez variables puntero a
enteros:
Int *ptr[10]; Int ptr[10];
Inicializacin de un array de punteros a cadenas Inicializacin de un array de punteros a cadenas
La inicializacin de un array de punteros a cadenas La inicializacin de un array de punteros a cadenas
se puede realizar con una declaracin similar a
esta; esta;
Char
* b [12]={ f b *nombres_meses[12]={enero,febrero,marzo,
abril,mayo,junio,julio,agosto,septiembre,
b i b di i b } octubre,noviembre,diciembre};
Punteros de cadenas Punteros de cadenas
Los punteros se pueden utilizar en lugar de ndices p p g
de arrays. Considrese la siguiente declaracin de
un array de caracteres que contiene las letras del
alfabeto;
Char alfabeto[27]=ABCDE.z; [ ] ;
P=&alfabeto[0]
Printf(%c\n *p); Printf( %c\n , p);
Aritmtica de punteros Aritmtica de punteros
Al contrario que un nombre de un array, que es un puntero constante y no
d difi t i bl d difi se puede modificar, un puntero es una variable que se puede modificar.
Como consecuencia, se pueden realizar ciertas operaciones aritmticas
sobre punteros
A un puntero se le puede sumar o restar un entero n; esto hace que apunte A un puntero se le puede sumar o restar un entero n; esto hace que apunte
n posiciones adelante, o atrs del actual. Las operaciones no validas son;
suma, multiplicacin o divisin entre dos punteros
Float m[20]; Float m[20];
Float *r;
r=m;
r++ r++
Ejemplo conversin de caracteres 10 8 Ejemplo conversin de caracteres 10.8
Convierte caracteres de minsculas a maysculas Convierte caracteres de minsculas a maysculas
Punteros constantes frente a punteros a constantes Punteros constantes frente a punteros a constantes
Un puntero constante es un puntero que no se puede Un puntero constante es un puntero que no se puede
cambiar, pero que los datos apuntados por el
puntero pueden ser cambiados Por otra parte un puntero pueden ser cambiados. Por otra parte, un
puntero a una constante se puede modificar para
apuntar a una constante diferente pero los datos apuntar a una constante diferente, pero los datos
apuntados por el puntero no se pueden cambiar
Punteros constantes Punteros constantes
Para crear un puntero constante diferente de un array,
se debe utilizar el siguiente formato:
<Tipo de dato>*const<nombre puntero>=<direccin de
variable>; variable>;
Int x;
Int y; y;
Int *const p1=&x;
*p1=y, es legal ya que se cambia el contenido de memoria
p1=&y , no es legal ya que se cambia el valor del puntero
Punteros a constantes Punteros a constantes
El formato para definir un puntero a una constante es; p p ;
Const<tipo de dato elemento>*<nombre
puntero>=<direccin de constante>;
Const int x=25;
Const int y=50;
Const int *p1=&x;
P1=&y, p1 apunta a otra constante
* 1 15 d il i *p1=15, crea un error de compilacin
Punteros constantes a constantes Punteros constantes a constantes
El ultimo caso a considerar es crear punteros constantes
a constantes utilizando el formato siguiente;
Const <tipo de dato elemento> *const <nombre
puntero>=<direccion de constante>; puntero>=<direccion de constante>;
Const int x=25;
Const int *const p1=&x; p ;
P1 es un entero constante que apunta a una constante
entera x, cualquier intento de modificar p1 o bien *p1
producir un error producir un error
Punteros como argumentos de funciones Punteros como argumentos de funciones
Cuando se pasa una variable a una funcin (paso por valor)
no se puede cambiar el valor de esa variable. Sin embargo,
si se pasa un puntero a una variable a una funcin (paso
por direccin) se puede cambiar el valor de la variable p ) p
Void func1 (int *s, int t) int i, j;
{ i=5;
* 6 j 7 *s=6; j=7;
t=25; func1 (&i, j);
}}
Punteros a funciones Punteros a funciones
Es posible crear punteros que apunten a funciones. En lugar p p q p g
de direccionar datos, los punteros de funciones apuntan a
cdigo ejecutable. Al igual que los datos, las funciones se
almacenan en memoria y tienen direcciones iniciales En C se almacenan en memoria y tienen direcciones iniciales. En C se
pueden asignar las direcciones iniciales de funciones a
punteros. Tales funciones se pueden llamar en un modo p p
indirecto, es decir mediante un puntero cuyo valor es igual a
la direccin inicial de la funcin en cuestin
Ti d (* F i ) ( li d ) Tipo_de_retorno (*punteroFuncion) (<lista de parametros>);
Cont Cont
Un puntero a una funcin es simplemente un puntero cuyo p p p y
valor es la direccin del nombre de la funcin. Dado que el
nombre es, en si mismo, un puntero; un puntero a una funcin
es un puntero a un puntero constante es un puntero a un puntero constante
Inicializacin de un puntero a una funcin Inicializacin de un puntero a una funcin
La sintaxis general para inicializar un puntero a una funcin
es:
punteroFuncion = una funcin
double calculo (int*v unsigned n) /*prototipo de funcin*/ double calculo (int*v; unsigned n); /*prototipo de funcin*/
double (*qf) (int*, unsigned); /*puntero a funcin*/
Int r[5]={3,5,6,7,1} { }
double x;
qf=calculo; /*asigna direccin de la funcin*/
=qf(r 5) /*llamada a la f ncin con el p ntero a f ncin*/ x=qf(r,5); /*llamada a la funcin con el puntero a funcin*/
Ejemplo 10 6 Ejemplo 10.6
Se desea ordenar un array de numero reales, la Se desea ordenar un array de numero reales, la
ordenacin se va a realizar con la funcin qsort()
Arrays de punteros de funciones Arrays de punteros de funciones
Ciertas aplicaciones requieren disponer de numerosas p q p
funciones, basadas en el cumplimiento de ciertas
condiciones. Un mtodo para implementar tal aplicacin es
utilizar una sentencia switch con muchos selectores case utilizar una sentencia switch con muchos selectores case.
Otra solucin es utilizar un array de punteros de funcin. Se
puede seleccionar una funcin de la lista y llamarla p y
La sintaxis general de un array de punteros de funcin es:
tipoRetorno (*PunteroFunc[LongArray])(<lista de parametros>)
Punteros a estructuras Punteros a estructuras
Un puntero tambin puede apuntar a una estructura. Se p p p
puede declarar un puntero a una estructura tal como se
declara un puntero a cualquier otro objeto y se declara
un puntero estructura tal como se declara cualquier otra
variable estructura: especificando un puntero en lugar
del nombre de la variable estructura del nombre de la variable estructura
Strcuct persona *p; /*se crea un puntero de estructura*/
p=&empleado; p=&empleado;
Ejemplo 10 9 Ejemplo 10.9
En este ejemplo se declara el tipo estructura En este ejemplo se declara el tipo estructura
t_persona, que se asocia con el tipo persona para
facilidad de escritura Un array de esta estructura facilidad de escritura. Un array de esta estructura
se inicializa con campos al azar y se muestran por
pantalla pantalla
Ejercicios Ejercicios
Escribir un programa en que se lean 20 lneas de texto, cada lnea
i d 80 M ll l d con un mximo de 80 caracteres. Mostrar por pantalla el numero de
vocales que tiene cada lnea
Se requiere evaluar las funciones f(x), g(x) y z(x) para todos los
valores de x en el intervalo 0<=x<=3.5 con incrementos de 0.2.
escribir un programa que evalu dichas funciones, utilizar un array
de punteros a funcin.
Las funciones son las siguientes;
F(x)=3*e
x
-2x
G(x)=-x*Sin(x)+1.5 ( ) ( )
Z(x)=x
3
-2x+1
Patrn de prueba de pantalla panormica (16:9)
Prueba de la
relacin de
aspecto
(Debe parecer circular)
16x9
4x3

S-ar putea să vă placă și