Está en la página 1de 16

UdeMM

Algoritmos y Estructuras de Datos / Informtica II


Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
Direcciones de memoria:
na !aria"le# tiene cuatro atri"utos muy importantes$
su nom"re#
su tipo#
su !alor#
y su direcci%n de memoria.
Por e&emplo$
int n = 12 ;
'om"re$ n
(ipo$ int ()aria"le entera de * "ytes+.
)alor$ 12.
Direcci%n de memoria$ es alguna direcci%n dentro de la memoria principal# como
por e&emplo 0013FF7C# en la ,ue se almacena el !alor de
la !aria"le# ,ue es -*.
As. es como !emos el !alor de la !aria"le$
printf( "%i" , n ) ; /esultado$ 12
y as. es como !emos la posici%n de la memoria de la !aria"le n$
printf( "%p" , &n ) ; E&emplo de resultado$ 0013FF7C
siendo$ %p: formato para mostrar !alores he0adecimales.
&: Operador de direccin. Es unario# y como tal# tiene *1
posici%n en la &erar,u.a de los operadores 2despu3s de [ ] y
( )# y con el mismo orden de &erar,u.a ,ue ++# --# etc.+.
Pgina 1
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
E&emplo$
#includ "!td"f#$%"
#includ &c'ni'$%(
)'id *"in ()'id)
+
int n = 12 , # = 3, ;
printf( "-n."ri"/l n$" ) ;
printf( "-n."l'r0 %i$ 1ircci'n d **'ri"0 %p$" , n , &n ) ;
printf( "-n."ri"/l #$" ) ;
printf( "-n."l'r0 %i$ 1ircci'n d **'ri"0 %p$" , # , &# ) ;
2tc%();
3
n e&emplo de la salida de este programa es$
."ri"/l n$
."l'r 12$ 1ircci'n d **'ri"0 0013FF7C$
."ri"/l #$
."l'r 3,$ 1ircci'n d **'ri"0 0013FF74$
Pgina 2
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
Punteros:
n puntero es una !aria"le ,ue tiene una direcci%n de memoria de otra !aria"le.
Para su uso# de"emos definir un tipo de !aria"le puntero.
4o mismo ,ue con cual,uier otra !aria"le# de"e ser definida antes de ser usada.
Por e&emplo# definimos una !aria"le puntero colocando un asterisco entre el tipo y
el nom"re de la !aria"le# como por e&emplo$ int 5 p6d"d.
#includ "!td"f#$%"
#includ &c'ni'$%(
)'id *"in ()'id) +
int 6d"d = 73 ;
int 5 p6d"d = &6d"d ;
printf( "-n6d"d0 %d" , 6d"d ) ;
printf( "-n1ircci'n d **'ri" d 6d"d0 %p" , &6d"d ) ;
printf( "-n8untr' d 6d"d0 %p" , p6d"d ) ;
2tc%();
3
n e&emplo de la salida de este programa es$
Edad: 53
Direccion de memoria de Edad: 0013FF7C
Puntero de Edad: 0013FF7C
4os espacios en "lanco a los lados del asterisco son irrele!antes. Es lo mismo
cual,uiera de las siguientes formas$
int 5 p6d"d = &6d"d ;
int5 p6d"d = &6d"d ;
int 5p6d"d = &6d"d ;
int5p6d"d = &6d"d ;
Asignar un !alor a la !aria"le original# es lo mismo ,ue asignrselo al puntero
antecedido con un asterisco.
En otras pala"ras# es lo mismo5
6d"d = 73 ; 5,ue5 5p6d"d = 73 ;
Pgina 3
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
)eamos algunas formas e,ui!alentes$
6ormas e,ui!alentes
int 6d"d = 73 ;
int 5 p6d"d = &6d"d ;
int 6d"d ;
int 5 p6d"d ;
p6d"d = &6d"d ;
5p6d"d = 73 ;
Asignamos el !alor a tra!3s
de la !aria"le original.
Asignamos el !alor a tra!3s
del puntero.
Pgina 4
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
7e puede hacer un puntero de un puntero.
E&emplo$ puntero# del puntero# del puntero$
int 6d"d = 73 ;
int 5 p6d"d = &6d"d ;
int 55 pp6d"d = &p6d"d ;
int 555 ppp6d"d = &pp6d"d ;
)eamos un e&emplo completo$
#includ "!td"f#$%"
#includ "c'ni'$%"
)'id *"in ()'id) +
int 9 = 12;
int 5p9 = &9;
int 55pp9 = &p9;
int 555ppp9 = &pp9;
printf( ":" )"ri"/l # )"l %i", 9 );
printf( "-n:" )"ri"/l # )"l %i", 5p9 );
printf( "-n:" )"ri"/l # )"l %i", 55pp9 );
printf( "-n:" )"ri"/l # )"l %i", 555ppp9 );
2tc%();
3
En todos los casos# nos muestra el mismo !alor# ya sea usando directamente la
!aria"le# o usando punteros# o punteros de punteros.
La variable x vale 12
La variable x vale 12
La variable x vale 12
La variable x vale 12
Pgina 5
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
A continuaci%n !eremos un e&emplo de pasar un puntero como argumento de
un su"programa.
#includ "!td"f#$%"
)'id !8r'2r"*"( c%"r 5 c%"r;puntr' ); <<pr't'tip'
)'id *"in ()'id) +
c%"r 9 = =>=; << ."ri"/l 9 d tip' c%"r
c%"r 5p9; << 8untr' " c%"r p9
p9 = &9; << 1ircci'n d **'ri" d 9 "l puntr' p9
printf("-n-n6?@ABC? 6D 6: 8ECFEABA *"in$");
printf("-n:" dircci'n d **'ri" d 90 %p", &9);
printf("-nG !u )"l'r !0 %c -n", 5p9 );
!8r'2r"*"( &9 );
3
)'id !8r'2r"*"( c%"r 5 c%"r;puntr' ) +
printf("-n-n6?@ABC? 6D 6: ?HI8ECFEABA !8r'2r"*"$");
printf("-n:" dircci'n d **'ri" d 90 %p", c%"r;puntr');
printf("-nG !u )"l'r !0 %c -n", 5c%"r;puntr');
3
4a salida de este programa es$

ES!"#S E$ EL P%#&%!"! main'
La direccion de memoria de (: 0012FF7C
) *u valor e*: +
ES!"#S E$ EL S,-P%#&%!"! *Pro.rama'
La direccion de memoria de (: 0012FF7C
) *u valor e*: +
Pgina 6
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
E&ercicio$
8Cual es la salida del siguiente programa9
#includ "!td"f#$%"
)'id *"in ()'id) +
int A, I, C, 5pA, 5pI;
pA = &A;
5pA = 1;
pI = &I;
5pI = 2;
pA = pI;
5pA = 3;
pI = &C;
5pI = ,;
printf("%i %i %i-n", A, I, C);
3
/espuesta$
1 3 /
)eamos como fueron !ariando las !aria"les 2lea los comentarios+$
#includ "!td"f#$%"
)'id *"in ()'id) +
int A, I, C, 5pA, 5pI;
pA = &A;
5pA = 1; <<A=1
pI = &I;
5pI = 2; <<I=2
pA = pI; <<"%'r" l puntr' pA n' !t" *J! rl"ci'n"d' c'n A,
<<!in' Ku l' !tJ c'n I
5pA = 3; <<I=3
pI = &C;
5pI = ,; <<C=,
printf("%i %i %i-n", A, I, C);
3
Pgina 7
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
Nombres de vectores o matrices como punteros:
El nom"re de un !ector o de una matri:# es simplemente un puntero.
Para ser ms e0actos# es una constante puntero# ya ,ue no se lo puede
modificar.
Por eso# durante le e&ecuci%n del programa no se puede reali:ar la siguiente
asignaci%n$
LL = "%'l" "*i2'!" ;
7. se puede hacer algo e,ui!alente mediante una funci%n ,ue resuel!e el
pro"lema$
!trcpG( LL , "%'l" "*i2'!" ) ;
)eamos un e&emplo$
int )ct'r[] = + 100 , 270 , 3M0 , ,NN , 7M7 3 ;
Con su".ndices$ B*'ri" princip"l Con punteros$
)ct'r[0] 100 5()ct'r+0)
)ct'r[1] 270 5()ct'r+1)
)ct'r[2] 3M0 5()ct'r+2)
)ct'r[3] ,NN 5()ct'r+3)
)ct'r[,] 7M7 5()ct'r+,)
Por lo tanto# para usar los elementos de un !ector o de una matri:# se pueden
usar los su".ndices o los punteros.
'ota$ El primer caso del puntero# ,ue es
5()ct'r+0)
tam"i3n se lo puede considerar como$
5()ct'r) o sino simplemente como 5)ct'r
Pgina 8
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
)eamos un e&emplo de uso de punteros en !e: de su".ndices$
sando su".ndices sando punteros
#includ "!td"f#$%"
#includ &c'ni'$%(
)'id *"in ()'id) +
int i , #[] = + 10 , 12 , , 3 ;
f'r( i = 0 ; i & 3 ; i++ )
printf( "-n %i" , #[i] ) ;
2tc%();
3
#includ "!td"f#$%"
#includ &c'ni'$%(
)'id *"in ()'id) +
int i , #[] = + 10 , 12 , , 3 ;
f'r( i = 0 ; i & 3 ; i++ )
printf( "-n %i" , 5(#+i) ) ;
2tc%();
3
;"ser!emos ,ue no hemos usado los su".ndices# sino los punteros.
En !e: de usar #[i]# hemos usado 5(#+i)$
Muchos programadores prefieren usar punteros en !e: de su".ndices.
Pgina 9
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
E&ercicio$ Ingresar ' !alores# y mostrarlos de forma tal ,ue los primeros !alores
ingresados sean los <ltimos. =acerlo primero con su".ndices# y luego con
punteros.
Con su".ndices$
#includ "!td"f#$%"
)'id *"in ( )'id ) +
int n, i, B[100];
printf( "On2r! )"l'r p"r" D0 " );
!c"nf( "%i", &n );
f'r(i=0; i&n; i++) +
printf( "-nOn2r! l )"l'r p"r" B[%i]0 ", i+1 );
!c"nf( "%i", &B[i] );
3
printf( "-n:'! )"l'r! d f'r*" d!cndint !'n0" );
f'r( i=n-1 ; i(=0 ; i-- )
printf("-n%i", B[i] );
printf( "-n" );
3
Con punteros$
#includ "!td"f#$%"
)'id *"in ( )'id ) +
int n, i, B[100];
printf( "On2r! )"l'r p"r" D0 " );
!c"nf( "%i", &n );
f'r(i=0; i&n; i++) +
printf( "-nOn2r! l )"l'r p"r" B[%i]0 ", i+1 );
!c"nf( "%i", B+i );
3
printf( "-n:'! )"l'r! d f'r*" d!cndint !'n0" );
f'r( i=n-1 ; i(=0 ; i-- )
printf("-n%i", 5(B+i) );
printf( "-n" );
3
Pgina 10
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
)eamos ahora con matrices de dos dimensiones$
(omemos el siguiente e&emplo# al ,ue llamaremos >*"t?
0 1 2 3
0 ,0 74 70 -20
1 123 1 7 12
2 N3 12, 3 -M7
Ahora# mostraremos sus adems de sus !alores# sus elementos seg<n los
su".ndices$
0 1 2 3
0
,0
mat001001
74
mat001011
70
mat001021
-20
"at001031
1
123
mat011001
1
mat011011
7
mat011021
12
mat011031
2
N3
mat021001
12,
mat021011
3
mat021021
-M7
mat021031
6inalmente# mostraremos adems de los !alores# sus elementos seg<n los
punteros$
0 1 2 3
0
,0
2(2(mat304304
74
2(2(mat304314
70
2(2(mat304324
-20
2(2(mat304334
1
123
2(2(mat314304
1
2(2(mat314314
7
2(2(mat314324
12
2(2(mat314334
2
N3
2(2(mat324304
12,
2(2(mat324314
3
2(2(mat324324
-M7
2(2(mat324334
En otras pala"ras *"t[2][1] es 5(5(*"t+2)+1).
Pgina 11
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
El programa ,ue muestra los elementos de esta matri: usando punteros puede
ser$
#includ "!td"f#$%"
)'id *"in()'id) +
int *"t[3][,] = + ,0, 74, 70, -20,
123, 1, 7, 12,
N3, 12,, 3, -M7 3;
int i, P;
f'r( i=0 ; i&3 ; i++ ) +
f'r( P=0 ; P&, ; P++ )
printf("%i ", 5(5(*"t+i)+P) );
printf( "-n" );
3
3
4a salida es$
/0 75 50 620
123 1 7 12
73 12/ 3 685
Pgina 12
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
)eamos otro e&emplo$
c%"r .ct[] = + ">C:A" 3 ;
Con su".ndices$ B*'ri" princip"l Con punteros$
.ct[0] =>= 5.ct
.ct[1] =C= 5(.ct+1)
.ct[2] =:= 5(.ct+2)
.ct[3] =A= 5(.ct+3)
.ct[,] DH:: 5(.ct+,)
/ecordemos ,ue en el caso de !ectores de tipo c%"r# el <ltimo carcter es DH::
o sin% -0.
Pgina 13
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
)eamos este otro caso# en el ,ue asignamos !alores a !aria"les.
4uego# !emos el !alor de la <ltima de ella y los siguientes$
#includ "!td"f#$%"
#includ "c'ni'$%"
)'id *"in ()'id) +
int i;
int " = 10 , */ = -7 , c = 3 , #[] = + 1 , 12 3, r ;
int 5 p;
p = &r;
printf( "-n."ri"/l " n dircci'n 0#%p", &" );
printf( "-n."ri"/l */ n dircci'n 0#%p", &*/ );
printf( "-n."ri"/l c n dircci'n 0#%p", &c );
printf( "-n."ri"/l #[0] n dircci'n 0#%p", &#[0] );
printf( "-n."ri"/l #[1] n dircci'n 0#%p", &#[1] );
printf( "-n."ri"/l r n dircci'n 0#%p", &r );
printf( "-n" );
f'r( i = 0 ; i & N ; i++ )
printf( "-n8"r" i0 %i, )"l'r %i" , i , 5(p+i) ) ;
2tc%();
3
Pgina 14
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
4a salida es$
Cuando >i0 0?# es la !aria"le >r?# muestra "asura.
Cuando >i0 1?# es la !aria"le >#[0]?# muestra 1.
Cuando >i0 2?# es la !aria"le >#[1]?# muestra 12.
Cuando >i0 3?# es la !aria"le >c?# muestra 3.
Cuando >i0 ,?# es la !aria"le >*/?# muestra -5.
Cuando >i0 7?# es la !aria"le >"?# muestra 10.
Cuando >i0 M?# no es !aria"le# muestra "asura.
Cuando >i0 7?# no es !aria"le# muestra "asura.
Cuando >i0 4?# no es !aria"le# muestra "asura.
Cuando se muestra "asura# es por,ue no tiene !alor asignado.
Pgina 15
UdeMM
Algoritmos y Estructuras de Datos / Informtica II
Propiedad intelectual Mg. Prof. Carlos Desmaras
carlos_desmaras@yahoo.com
7in em"argo# as. es como tra"a&a Visua !""# pero '; es as. como tra"a&an otros
lengua&es !"".
7in em"argo# este e&emplo ha ser!ido para !er como podemos a!an:ar por las
posiciones de memoria.
)eamos como se comporta otro lengua&e C@@$
#includ "!td"f#$%"
#includ &!tdi'$%(
)'id *"in ()'id) +
int i;
int " = 10 , */ = -7 , c = 3 , #[] = + 1 , 12 3, r ;
int 5 p;
p = &r;
f'r( i = 0 ; i & M ; i++ )
printf( "-n 6l*nt' %i0 %i" , i , 5(p+i) ) ;
2tc%();
3
4a salida ser$
6l*nt' 00 10
6l*nt' 10 -7
6l*nt' 20 3
6l*nt' 30 1
6l*nt' ,0 12
6l*nt' 70 -474NN3,M0 2"asura por,ue >r? no tiene !alores asignados+
)emos ,ue en este caso a!an:amos en las posiciones de memoria# en el sentido
contrario al ,ue nos despla:"amos en Visua !"".
Pgina 16

También podría gustarte