Title: Dise
1Diseño de algoritmosPunteros
Claudio Gutiérrez-Soto.
2Punteros
- Un puntero es una variable que hace referencia a
una dirección de memoria - Sintaxis
- Tipo_Dato nombre_variable_puntero
- Ejemplo
- int p
-
- Asignación de Dirección
- nombre_punterovariable
3Punteros
- El carácter delante de una variable indica que
lo se está accediendo es a la dirección de
memoria de dicha variable. - Ejemplo
- int p
- p0 / p posee la dirección NULL
ó 0/ - pNULL / p posee la dirección NULL ó
0/ - pi /p apunta hacia i ó
conteniendo la dirección de i / - p(int )1501 /dirección absoluta de
memoria /
4Punteros
" Si p es un puntero, entonces p es el valor de
la variable a la que apunta . Ejemplo double
x,y,p px yp Lo anterior es
equivalente a yx yx
5Punteros
Inicialización Sintaxis tipo_dato
nombre_punterovariable Ejemplo int i7,pi
6Punteros
- Construcciones a las que no se debe apuntar.
- No apuntar a constantes.
- 3 / ilicito/
- No apuntar a arreglos, el nombre de un arreglo
es una constante - int a77
- a
- No apuntar a expresiones ordinarias
-
- (k99)
7Punteros
No apuntar a variables de tipo register.
register v v Si a es un arreglo,
expresiones como a0 y aij3 adquieren
sentido
8Punteros
int i3, j5, k,pi, q5,r double x11.5
9Punteros
10Punteros
- Llamada por valor
- Máx(a,b)
- Int a,b
-
- return((agtb)?ab)
-
- Llamado por referencia
- Máx(a,b,m_ptr)
- Int a, b,m_ptr
-
- m_ptr(agtb)?ab
11Punteros
Relación entre punteros y arreglos. Un
puntero es una variable cuyos valores son
direcciones. El nombre de un arreglo es una
dirección o puntero fijo. Cuando se declara un
arreglo, el compilador debe asignar una dirección
base y la cantidad de almacenamiento suficiente
como para alojar a todos los elementos del
arreglo.
12Punteros
define TAM 100 int aTAM, p y el
sistema hece que los bytes numerados 300, 304,
309,......696 sean las direcciones de a0,
a1, a2,...,a99. pa pa0
13Punteros
Aritmética de punteros La aritmética de
puntero proporciona una opción para la indización
de arreglos, las proposiciones pa1 pa1
Sumar un arreglo suma0 for(pa
pltaTAMp) sumap
14Punteros
suma0 for(i0iltTAMi) suma(ai) Debid
o a que a es un puntero constante, las
expresiones como ap a a2 Son
ilícitas, no se puede cambiar la dirección de
a. Expresiones apuntadoras como p1, p y pi
son válidas. Double a doublea
15Punteros
Cadenas Las cadenas son arreglos
unidimensionales de tipo char, Por convención,
una cadena en C se termina con centinela de fin
de cadena ó carácter nulo \0. char s
"ABC" char p"a es por anon o pastel
alfabeto" void main() char q"del cual
todos tienen parte" printf("\ns,s\n
s",s,p,q) ABC a es por anon o pastel
alfabeto del cual todos tienen
parte. For(pqq!'\0'q) q1 printf(
"\n s\n\n",p)
16Punteros
Arreglos multidimensionales Expresiones
equivalentes abii (bij) ((bi))j ((
(bi))J) (b005ij) Al definir la
función, en el encabezamiento, la
declaración Int (v)5 int v 5 Int
c792 Cijk (c00092i2j
k)
17Asignación dinámica de memoria
- Cuando definimos un arreglo con un tamaño
definido, podemos tener dos posibles casos, uno
es un desaprovechamiento de la memoria y otro es
la falta de espacio, lo cual en general no sucede.
18Asignación dinámica de memoria
- Por ende, podría ser posible definir
- int x
- En lugar de
- int x10
- No obstante, si no conocemos el tamaño de manera
predeterminada, es posible asignar espacio de
manera dinámica.
19Asignación dinámica de memoria
- Así para asignar memoria de manera dinámica
podemos utilizar la función malloc, como sigue - x (int )malloc(10sizeof(int))
- Esta función reserva un bloque de memoria cuyo
tamaño (en bytes) es equivalente a 10 cantidades
enteras.
20Asignación dinámica de memoria
- En general el ltltcastgtgt de tipo que procede a
malloc debe ser consistente con el tipo de datos
de la variable puntero. - Así si quisiéramos pedir en tiempo de ejecución
para una variable tipo double sería - y(double )malloc(10sizeof(double))
21Asignación dinámica de memoria
- int i,n,x
- .
- printf(Cuántos números serán ingresados\)
- scanf(d,n)
- / reserva de memoria para n /
- x(int )malloc(nsizeof(int))
- for(i0iltni)
- printf( id x, i1)
- scanf(d,xi)
-
22Uso de typedef en estructuras
- Recordemos que la palabra reservada typedef nos
permite redefinir un tipo de dato, por ejemplo - typedef int entero
- Es posible definir tipos de datos con la nueva
definición - entero a,b,c
23Uso de typedef en estructuras
- Por ello, en términos generales se puede definir.
- typedef struct
- miembro 1
- miembro 2
- miembro 3
- .
- nuevo-tipo
24Uso de typedef en estructuras
- typedef struct
- int mes
- int dia
- int anho
- fecha
- fecha Aux
25Estructuras y punteros
- Podemos acceder a la dirección de una variable
estructura de la misma manera que cualquier otra
dirección, mediante el uso del operador (). Así
podemos escribir - tipo ptvar
26Estructuras y punteros
- Ejemplo
- typedef struct
- int no_cuenta
- char tipo_cuenta
- char nombre80
- float saldo
- cuenta
- cuenta cliente, pc
27Estructuras y punteros
- En este ejemplo cliente es una variable
estructura de tipo cuenta y pc un puntero que
apunta a una variable de tipo cuenta. - Por ende
- pccliente
- Así podemos acceder a un miembro individual de
una estructura en términos de su correspondiente
variable puntero escribiendo - Ptvar-gtmiembro
- Lo que es equivalente a escribir
- variable.miembro
28Estructuras y punteros
- El operador -gt puede combinarse con el operador
punto para acceder a un submiembro dentro de una
estructura. Por lo tanto, un submiembro puede ser
accedido escribiendo - ptvar-gtmiembro.submiembro
29Estructuras y punteros
- struct Cuenta
- int no_cuenta
- char tipo_cuenta
- char nombre80
- float saldo
- fecha ultimopago
- cliente,pccliente
- cliente.no_cuenta, pc-gtno_cuenta,
- (pc).no_cuenta
typedef struct int mes int dia int
anio fecha
30Estructuras y punteros
- struct Cuenta
- int no_cuenta
- char tipo_cuenta
- char nombre80
- float saldo
- fecha ultimopago
- cliente,pccliente
- cliente.ultimopago.mes, pc-gtultimopago.mes,
- (pc).ultimopago.mes
typedef struct int mes int dia int
anio fecha
31Estructuras y punteros
- struct Cuenta
- int no_cuenta
- char tipo_cuenta
- char nombre80
- float saldo
- fecha ultimopago
- cliente,pccliente
typedef struct int mes int dia int
anio fecha
Para acceder al tercer carácter del nombre, este
puede ser accedido de la siguiente manera
cliente.nombre2 pc-gtnombre2
(pc).nombre2
32Ejemplo
- cliente.no_cuentan
- cliente.tipo_cuentat
- cliente.nombreLázaro
- cliente.saldob
- printf(d c s .2f,cliente.no_cuenta,cliente
.tipo_cuenta, cliente.nombre,cliente.saldo) - printf(d c s .2f \n,pc-gtno_cuenta,pc-gttipo
_cuenta, pc-gtnombre,pc-gtsaldo) -
- 3333 A Lázaro 99.99
- 3333 A Lázaro 99.99
main() int n3333 char tA float
b99.99 typedef struct int mes int
dia int anio fecha struct Cuenta int
no_cuenta char tipo_cuenta char
nombre float saldo fecha ultimopago
cliente,pccliente
33Preguntas?