El documento presenta diferentes temas relacionados con punteros en C, incluyendo cómo declarar y asignar punteros, aritmética de punteros, punteros a arrays, punteros a funciones y punteros a estructuras. También propone ejercicios para practicar el uso de punteros, como leer líneas de texto y contar vocales, o evaluar funciones utilizando un array de punteros a funciones.
1. Evaluación escrita
Indique como se realiza la declaración y la
llamada a una función
Indique como se declara y asigna valores a un
array
Describa las ventajas de usar estructuras y como se
declaran
2. Ejercicios
Elabore un programa que lea una cadena de 50
caracteres y convierta las vocales en mayúsculas
Elabore un programa que obtenga el determinante
de una matriz 3x3 ingresada por el usuario
3. PUNTEROS
(
(APUNTADORES)
)
Sugerencias y herramientas para crear para crear y presentar diapositivas en
formato panorámico
4. Contenido
Direcciones en memoria Aritmética de punteros
p
Concepto de puntero Punteros constantes frente
(apuntador) a punteros a constantes
Puntero null y void
P t ll id Punteros como argumento
Punteros a punteros de funciones
Punteros a Arrays Punteros a funciones
Arrays de punteros Punteros a estructuras
Punteros a cadenas Ejercicios
j
5. Dirección de memoria
Cuando una variable se declara, se asocian tres
,
atributos fundamentales con la misma: su nombre, su
tipo y su dirección de memoria
Int n;
Asocia al nombre n, el tipo int y la dirección de alguna
p g
posición de memoria donde se almacena el valor de n
6. 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 dirección de la variable se accede por medio del
operador de dirección &. Por ejemplo, se puede
imprimir la dirección de n con la sentencia:
Printf (“%p”,&n);
P i tf (“% ” & )
7. Ejemplo 10 1
10.1
Obtener el valor y la dirección de una variable
#include
# l d <stdio.h>
d h
#include <stdlib.h>
int main ()
{
int n=75;
printf("n=%dn",n);
printf( &n=%pn &n);
printf("&n=%pn",&n);
system("pause");
return 0;
}
8. Concepto de puntero (apuntador)
Un puntero es una variable que contiene una dirección de memoria
El tipo de variable que almacena una dirección se denomina puntero
Los punteros se rigen por estas reglas básicas:
Un puntero es una variable como cualquier otra;
Una variable puntero contiene una dirección que apunta a otra posición
en memoria
En esa posición se almacenan los datos a los que apunta el puntero
Un puntero apunta a una variable de memoria
9. Ejemplo 10 2
10.2
#include <stdio.h>
#include <stdlib.h>
#i l d < dlib h>
int main ()
{
int 75
i n=75;
int*p=&n;
printf("n=%d, &n=%p, p=%pn",n,&n,p);
printf("&p=%pn",&p);
i tf("& % " & )
system("PAUSE");
return 0;
}
10. Declaración de punteros
Al igual que cualquier variable, las variables punteros
g q q , p
han de ser declaradas antes de utilizarlas. La
declaración 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 (*)
<tipo de dato apuntado>*<identificador de puntero>
Float*f;
Fl t*f
11. Inicialización de punteros
La inicialización de un puntero proporciona a ese puntero la
dirección del dato correspondiente. Para asignar una
dirección de memoria a un puntero se utiliza el operador de
referencia &.
&valor
Int i;
Int *p;
P=&i; /*asigna la dirección de i a p*/
*p=50; /*asigna un valor a la dirección de memoria /
p 50; / asigna memoria*/
12. Indireccion de punteros
#include <stdio.h>
El uso de un puntero #include <stdlib h>
<stdlib.h>
char c;
para obtener el valor int main()
al que apunta es decir,
apunta, decir {
char *pc;
su dato apuntado se pc=&c;
for(c='A';c<='Z';c++)
denomina indireccionar printf("%c",*pc);
printf("n");
el puntero system("pause");
return 0;
}
13. Punteros null y void
Un puntero nulo no apunta a ninguna parte, no direcciona ningún dato
valido en memoria
lid i
#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 método es
declarar el puntero como puntero void* denominado puntero genérico
Void *prt
14. Punteros a punteros
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;
ptr5 &ptr1;
15. 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,
únicamente constantes d cadena
ú i de d
16. Nombres de arrays como punteros
Un nombre de un array es simplemente un puntero.
Supongamos que se tiene la siguiente declaración de un
array:
In lista[5]={10 20 30 40 50}
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,
también se vera 10 0
Dado que un nombre de un array contiene la dirección del
primer elemento del array se debe indireccionar el puntero
array,
para obtener el valor del elemento
17. 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
enteros:
Int *ptr[10];
ptr[10];
18. Inicialización de un array de punteros a cadenas
La inicialización de un array de punteros a cadenas
se puede realizar con una declaración similar a
esta;
Char
*nombres_meses[12]={“enero”,”febrero”,”marzo”,”
* b [12]={“ ” ”f b ”” ””
abril”,”mayo”,”junio”,”julio”,”agosto”,”septiembre”,”
octubre”,”noviembre”,”diciembre”};
b ” ” i b ” ”di i b ”}
19. Punteros de cadenas
Los punteros se pueden utilizar en lugar de índices
p p g
de arrays. Considérese la siguiente declaración de
un array de caracteres que contiene las letras del
alfabeto;
Char alfabeto[27]=“ABCDE….z”;
[ ] ;
P=&alfabeto[0]
Printf( %cn p);
Printf(“%cn”,*p);
20. Aritmética de punteros
Al contrario que un nombre de un array, que es un puntero constante y no
se puede modificar, un puntero es una variable que se puede modificar.
d difi t i bl d difi
Como consecuencia, se pueden realizar ciertas operaciones aritméticas
sobre punteros
A un puntero se le puede sumar o restar un entero n; esto hace que apunte
n posiciones adelante, o atrás del actual. Las operaciones no validas son;
suma, multiplicación o división entre dos punteros
Float m[20];
Float *r;
r=m;
r++
21. Ejemplo conversión de caracteres 10 8
10.8
Convierte caracteres de minúsculas a mayúsculas
22. Punteros constantes frente a punteros a constantes
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
cambiados. parte,
puntero a una constante se puede modificar para
apuntar a una constante diferente pero los datos
diferente,
apuntados por el puntero no se pueden cambiar
23. Punteros constantes
Para crear un puntero constante diferente de un array,
se debe utilizar el siguiente formato:
<Tipo de dato>*const<nombre puntero>=<dirección de
variable>;
Int x;
Int 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
24. Punteros a constantes
El formato para definir un puntero a una constante es;
p p ;
Const<tipo de dato elemento>*<nombre
puntero>=<dirección de constante>;
Const int x=25;
Const int y=50;
Const int *p1=&x;
P1=&y, p1 apunta a otra constante
*p1=15,
* 1 15 crea un error de compilación
d il ió
25. 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>;
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
26. Punteros como argumentos de funciones
Cuando se pasa una variable a una función (paso por valor)
no se puede cambiar el valor de esa variable. Sin embargo,
si se pasa un puntero a una variable a una función (paso
p
por dirección) se puede cambiar el valor de la variable
) p
Void func1 (int *s, int t) int i, j;
{ i=5;
*s=6;
* 6 j=7;
j 7
t=25; func1 (&i, j);
}
27. 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
código ejecutable. Al igual que los datos, las funciones se
almacenan en memoria y tienen direcciones iniciales En C se
iniciales.
pueden asignar las direcciones iniciales de funciones a
p
punteros. Tales funciones se pueden llamar en un modo
p
indirecto, es decir mediante un puntero cuyo valor es igual a
la dirección inicial de la función en cuestión
Tipo_de_retorno (*
Ti d (*punteroFuncion) ( li d parametros>);
F i ) (<lista de )
28. Cont…
Cont
Un puntero a una función es simplemente un puntero cuyo
p p p y
valor es la dirección del nombre de la función. Dado que el
nombre es, en si mismo, un puntero; un puntero a una función
es un puntero a un puntero constante
29. Inicialización de un puntero a una función
La sintaxis general para inicializar un puntero a una función
es:
punteroFuncion = una función
double calculo (int*v unsigned n) /*prototipo de función*/
(int*v; n);
double (*qf) (int*, unsigned); /*puntero a función*/
Int r[5]={3,5,6,7,1}
{ }
double x;
qf=calculo; /*asigna dirección de la función*/
x=qf(r,5); /*llamada a la función con el p ntero a función*/
=qf(r 5) f nción puntero f nción*/
30. Ejemplo 10 6
10.6
Se desea ordenar un array de numero reales, la
ordenación se va a realizar con la función qsort()
31. Arrays de punteros de funciones
Ciertas aplicaciones requieren disponer de numerosas
p q p
funciones, basadas en el cumplimiento de ciertas
condiciones. Un método para implementar tal aplicación es
utilizar una sentencia switch con muchos selectores casecase.
Otra solución es utilizar un array de punteros de función. Se
p
puede seleccionar una función de la lista y llamarla
La sintaxis general de un array de punteros de función es:
tipoRetorno (*PunteroFunc[LongArray])(<lista de parametros>)
32. Punteros a estructuras
Un puntero también 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
Strcuct persona *p; /*se crea un puntero de estructura*/
p=&empleado;
33. Ejemplo 10 9
10.9
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
escritura.
se inicializa con campos al azar y se muestran por
pantalla
34. Ejercicios
Escribir un programa en que se lean 20 líneas de texto, cada línea
con un máximo d 80 caracteres. M
á i de Mostrar por pantalla el numero d
ll l de
vocales que tiene cada línea
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 función.
Las funciones son las siguientes;
F(x)=3*ex-2x
G(x)=-x*Sin(x)+1.5
( ) ( )
Z(x)=x3-2x+1
35. Patrón de prueba de pantalla panorámica (16:9)
Prueba de la
relación de
aspecto
(Debe parecer circular)
4x3
16x9