0 calificaciones0% encontró este documento útil (0 votos)
23 vistas16 páginas
El documento explica conceptos básicos sobre direcciones de memoria y punteros en C. Indica que cada variable tiene un nombre, tipo, valor y dirección de memoria. Luego explica cómo se pueden obtener la dirección de memoria de una variable y su valor usando punteros. También cubre punteros a punteros y el paso de punteros como argumentos de funciones.
El documento explica conceptos básicos sobre direcciones de memoria y punteros en C. Indica que cada variable tiene un nombre, tipo, valor y dirección de memoria. Luego explica cómo se pueden obtener la dirección de memoria de una variable y su valor usando punteros. También cubre punteros a punteros y el paso de punteros como argumentos de funciones.
El documento explica conceptos básicos sobre direcciones de memoria y punteros en C. Indica que cada variable tiene un nombre, tipo, valor y dirección de memoria. Luego explica cómo se pueden obtener la dirección de memoria de una variable y su valor usando punteros. También cubre punteros a punteros y el paso de punteros como argumentos de funciones.
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