2da Parte

54
Guíadel Estudiante Introducción a la Proqramación con C Respuestas a la Unidad 1: Examen de Autoevaluación 1 ) b 2)d 3) b 4)b 5) a 6) d 7)d B) b 9) c 1 0 ) a Volumen 4: Funciones en C Unidad 1: Funciones en C 37 @ Copyright IBM Corp. 2006 Los materiales del cursono pueden ser reproducidos total o parcialmente sin el permiso previo escrito de IBM

description

IBM

Transcript of 2da Parte

  • Gua del Estudiante Introduccin a la Proqramacin con C

    Respuestas a la Unidad 1: Examen de Autoevaluacin1 ) b2 ) d3 ) b4 ) b5) a6 ) d7 ) dB) b9) c

    1 0 ) a

    Volumen 4: Funciones en C Unidad 1 : Func iones en C 37

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Pgina dejada intencionalmente en blanco...

    Unidad 1: Funciones Volumen 4: Funciones en C 38

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante lntroduccin a la Prooramacin con C

    Unidad 2: Laborator io de Funciones

    Objetivos de Aprend tzajeAlfinal de esta unidad, usted ser capaz de:

    . Emplear funciones definidas por el usuario para modularizar los programas yalcanzar una estructura simple.

    . Escribir funciones para l levar a cabo tareas especf icas bien definidas.

    . Usar funciones en la de resolucin cie problemas.

    Volumen 4: Funciones en C Unidad 2: Laborator io de Funciones en C 39

    @ Copyright IBM Corp. 2006ros mater iales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Proqramacin con C Gua del Estudiante

    Ejercicios de Laboratorio1) Escribir un programa en C que imprima una tabla de enteros decimales desde r

    hasta N (esa es la entrada) junto con su equivalente en Nmero Romano.Escribir una funcin que tome un entero decimal como entrada e imprima elequivalernte en Nmero Romano y su entero decimal en una lnea. Se l istan acontinutcin los enteros decimales especficos y su equivalente en Romano:

    100500

    2) Considere un texto como entrada en ingls, el cual termina en el smbolo g.Escribir un programa que cuenta el nmero de vocales y el nmero deconsonantes que aparecen en el texto. Escribir dos funciones l lamadasesVocal ! esConsonanLe que tome un carcter como entrada y determine sies verdadero o falso en cada caso.

    Unidad 2: Laborator io de Funciones Volumen 4: Funciones en C 40

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

    151 050

    I

    V

    X

    Ic

    d

  • Gua del Estudiante Introduccin a la Programacin con C

    Unidad 3: Recursin

    Objetivos de Aprend izajeAl f ina l de esta unidad, Ud. ser capaz de:

    . Explicar qu es recursin.

    . Discutir las diferentes condiciones que deben ser satisfechas para que lasfu nciones recu rsivas trabajen correcta mente.

    . Describir cmo una funcin recursiva trabaja cuando se ejecuta.o Definir el rol de la pi la en la ejecucin de las funciones recursivas.

    Volumen 4: Funciones en C Unidad 3: Recursin en C 41

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    1. lntroduccinEn la Unidad 1 - Funciones de este volumen se discuti cmo los programadorespueden definir sus funciones e invocarlas desde cualquier parte de un programa C. Enesta unidad, se aprender acerca de un t ipo especial de funcin l lamada funcinrecursiva.

    La palabra 'recursin' se origina delaraz lat ina're', que signif ica'regresa/, y el sufi jolatin'currere', significa 'correr'. La palabra recursin literalmente significa 'correr haciaatrs', o'que suceda otra vez, especialmente en un intervalo especfico'. En el contextode fa programacin de computadoras, la palabra 'recursin'se refiere a una funcin quees capaz de llamarse as misma.

    En las unidades anteriores, se estudiaron diferentes t ipos de funciones. Se aprendi acmo escribir estas funciones y cmo usarlas e invocarlas. Sea el siguiente ejemplo:

    i n t m i R e c u r s i o n ( i n t x ) {

    m R e c u r s i o n ( x - 1 ) ;

    ]Aqu, se ha definido una parte de una funcin l lamada miRecursion. Se puede notarque la misma funcin miRecursion es invocada desde dentro del cuerpo de lafuncin definida.

    1.1. Def in ic in

    Una definicin apropiada de recursin ser: "Una tcnica algortmica donde una funcin,de manera de acometer una tarea, se l lama a s misma con valores modif icados en siusargumentos".En esta definicin, se t ienen algunas palabras reservadas que definen lascaractersticas de recursin. Recursin es realmente una tcnica algortmica que seemplea para resolver ciertos problemas. En el contexto de escribir programas en C, larecursin implica una funcin en C que puede ser l lamada desde dentro del cuerpo dela misma funcin. La funcin necesariamente debe realizar una tarea. Simplementel lamando cualquier funcin arbitraria dentro de s misma no tendr un propsito i i t i l .Cuando una funcin se l lama a s misma, lo hace con 'valores modif icados de susargumentos'. Usualmente, esto se manif iesta en los parmetros que son pasados at ravs de la l lamada. En e l e jemplo anter ior , la l lamada miRecurs ion(x-1)muestraque sta es l lamada 'con alguna parte de la tarea' como el argumento x- I .

    Unidad 3: Recursin Volumen 4: Funciones en C 42

    O Copyright IBM Corp. 2006Los materiales del curso no puederr ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    De la definicin anterior, es claro que la recursin implica un proceso repetit ivo, el cuales autoreferenciado. La recursin se encuentra en la vida diaria y, tal vez, inclusive seusa implcitamente.

    2. Escribir Funciones RecursivasA continuacin se discute como escribir funciones recursivas en C para resolverproblemas. En esta unidad, se aprendern los fundamentos de la programacin usandorecursin, para la resolucin de problemas simples con funciones matemticas.

    Ejemplo 3.1: Calcular el Factorial de un EnteroCalcular el factorial de un entero es, quizs, el ejemplo ms usado para ensear el usode la recursin a los principiantes. Se trabaj con este ejemplo en el Volutnen 2, Unidad3 - Construcciones lterativas. Sin embargo, por razones de completitud, se revisar denuevo. El factorial es un trmino matemtico que es definido para todos los enterosposit ivos. Por definicin, el factorial del entero 0 es 1. Para todos los otros enterosposit ivos, el factorial de n es el producto de todos los enteros desde t hasta n. Sea elsiguiente ejemplo:F a c t o r i a l d e 5 = 5 x 4 x 3 x 2 x 1 = 1 2 0

    En genera l , factor ia l de n (donde n > 0) = n x (n-1) x (n-2) x . . . x 1

    Se escribe el factorial de n como n ! (con el signo de exclamacin) y se lee comon-factorial. As,

    n ! = n x ( n - 1 ) x ( n - 2 ) x . . . x 1 p a r a t o d o s l o s v a l o r e s d e n > 0 .El factorial se puede tambin definir usando induccin matemtica, es decir,recursivamente, como sigue:

    n l = n x ( n - 1 ) t ( e s d e c i r , n m u l t i p l i c a d o p o r n - t f a c t o r i a l , s i n ' o )= 1 ( s i n = 0 )

    Esto es correcto y puede ser fci lmente verif icado. Considere 5!, por ejemplo:5 ! = 5 x 4 !

    = 5 x 4 x 3 != 5 x 4 x 3 x 2 l= 5 x 4 x 3 x 2 x 1 != 5 x 4 x 3 x 2 x 1 x 0 != 5 x 4 x 3 x 2 x 1 x 1= 5 x 4 x 3 x 2 x 1

    (dado que 0! = 1 por definicin)(dado que 1 x 1 = 1 de cualquier modo)

    Volumen 4: Funciones en C Unidad 3: Recursin en C 43

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Una definicin formal recursiva delfactorialde n se da a continuacin:

    n ! = 1 s i n = 0

    i f ( n = = 0 )r e t u r n 1 ;

    e l s e

    r e t u r n f a c t o r i a l ( n - 1 ) * n ;)

    Esta es una funcin recursiva, ya que factoria] se invoca desde dentro de la mismaflrncin. Ahora, se verifica si esto trabaja a travs de la lraza del programa.

    Asuma que se invoca f actorial con el parmetro 0. Cuando se hace la verif icacinif (n==0 ) , la condicin se hace vsRoADERo ya que n es 0. De manera que el valor 1(e l cual es e l factor ia l de 0) es retornado por f actor ia l .Ahora, si el factorial se invoca con el parmetro 1, la siguiente sentencia seejecuta:

    r e t u r n f a c t o r i a l ( n - 1 ) * n ;

    Esto s ign i f ica que e l fact -or ia l (0) se invocaf actor ia l (0 ) re tornar e l va lor 1 . Por lo cue,

    r e L u r n f . r c t o r . i a l ( O ) * 1 ;Esto realmente es 1 * 1 = 1. Por lo tanto r t

    Ahora si se invoc f actor ial (3 ) . Mientras nr), se t iene la sentencia:

    recursivamente. Ya que se sabe que ella sentencia a la larga har lo siguiente:

    - 1

    > o (esto es para valores de n = 3, 2 y

    r e t u r n f a c t o r i a l ( n - f ) * n ;La seirtencia anterior ser ejecutada recursivamente como:

    r e t u r n f a c t o r i a l ( 2 ) * 3 ;r e t u r n f a c t o r i a l ( 1 ) * 2 ;r e t u r n f a c t o r i a l ( 0 ) * 1 ;

    Esto es lo mismo que retornarr e t u r n 1 * 1 * 2 * 3 ;

    La funcin anterior termina correctamente. Dado que se t iene el caso base cuando n =o, elfactorial retorna como 1. La condicin base es muy importante, ya que permite queun algoritmo termine apropiadamente.

    Qu suceder si se invoca esta funcin con un parmetro que no es mayor o igual a 0,por eiemplo -3? En esta situacin, no existe un caso base vlido, por lo tanto la funcinactorial ser invocada indefinidamente con los parmetros -3, -4, -S, y as

    Unidad 3: Recursin Volumen 4: Funciones en C 44

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Prooramacin con C

    sucesivamente. La funcin recursiva no terminar. Sin embargo, a part ir de un t iempo,la funcin comenzar a usar mucha memoria y f inalmente se colgar.

    Fin del Ejemplo 3.1A continuacin se tratar de consolidar la comprensin de las funciones recursivas atravs de otro ejemplo simple: Encontrar el MCD entre dos nmeros.Ejemplo 3.2: Encontrar el MCD Entre Dos NmerosTodos han estudiado el MCD en los cursos de matemticas de la escuela. Cada uno,quizs conozca como calcular el MCD de dos enteros posit ivos. Suponga que se debeencontrar e l Iu tc (12, ro) . Cualquiera sea e l mtodo que se use, se puede fc i lmentedeterminar que e l MCD (12 , 16 ) = +. Uno de los mtodos ms s imples es enumerar e ld i v i so r de cada uno de l os en te ros . Los d i v i so res de 12 son 1 ,2 ,3 ,4 ,6 y 12 . Losdivisores de 16 son 1, 2,4, B y 16. A part ir de estos se puede observar que los divisorescomunes de 12 y 16 son 1 ,2y 4 .Po r l o tan to ,4 es e l MCD. Pe ro , ex i s te un m todo queno requiere enumerar los divisores de cada uno de los nmeros. Esto se origina de lasiguiente definicin recursiva:

    MCD(x,y) = MCD(x-y,y)

    A continuacin se verif ica si la definicin es correcta.M C D ( 1 2 , 1 6 )1 6 > 1 2

    s t x > = y

    s i x < y

    s i y = g

    s i x = 0

    = M C D ( 7 2 , L 6 - 1 2 ) M C D ( 1 2 , 4 ) y a q u e

    = MCD(x,y-x)= x

    = M C D ( 7 2 - 4 , 4 ) = M C D ( 8 , 4 ) y a q u e 7 2 > 4= M C D ( B - 4 , 4 ) = M C D ( 4 , 4 ) y a q u e B > 4= M C D ( 4 4 , 4 ) = M C D ( 0 , 4 ) = 4

    Este resultado coincide con el que se obtuvo anteriormente. A continuacrn se escribiruna funcin recursiva en C que calcula el MCD de dos enteros posit ivos.

    El cdigo C comienza aqu . . .f . i n L m c d ( i n L x , i n t y ) {2 . i n t r e s u l t a d o ;

    3 . i f ( x - = 0 ) {4 . r e s u l t a d o = y ;- t

    6 . e l s e

    Volumen 4: Funciones en C Unidad 3: Recursin en C 45

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • lntroduccin a la Proqramacin con C Gua del Estudiante

    i . i f $ = = o ) {8 . r e s u l t a d o = x ;e . )1 0 . e l s e

    1 1 . i f ( x > = Y ) {1 2 . r e s u l t a d o = m c d ( x - y , y ) ;1 3 . )1 4 . e l s e {1 5 . r e s u l t a d o = m c d ( x , y - x ) ;1 6 . )1 7 . r e t u r n ( r e s u l t a d o ) ;1 8 . )El cdigo C f inal iza aqu

    Nota: La verif icacin y=o y x=0 sirve como los casos base de la recursin. As que,mientras no haya valores negativos, el algoritmo terminar.

    Fin del Ejemplo 3.2Despus de discutir la recursin con la ayuda de varios ejemplos, se va a tratar deentender la relacin entre recursin e iteracin.

    3. Recursin vs. l teracinTodas las soluciones recursivas pueden normalmente ser resueltas usando iteraciones,mientras al inverso no es verdadero. Un cdigo recursivo es compacto, fcil de escribir yfci l de entender. El cdigo, sin embargo, no ahorra t iempo ni espacio. Para problemassencillos como el factorial etc., las soluciones iterativas son ms econmicas entrminos de espacio y t iempo.

    Unidad 3: Recursin Volumen 4: Funciones en C 46

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    ResumenAhora que ha completado esta unidad, usted debe ser capazde'.

    . Explicar la recursin.r Discutir las varias condiciones que necesitan ser satisfechas para que las

    fu nciones recu rsivas trabajen correcta mente.. Describir cmo una funcin recursiva trabaja cuando se ejecuta.. Definir el rol de la pi la en la ejecucirr de funciones recursivas.

    Volumen 4: Funciones en C Unidad 3: Recursin en C 47

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Urridad 3: Examen de Autoevaluacin1) Recursin es una

    a) Funcin que se invoca a s misma.b) Funcin que invoca a otra funcin.c) Funcin que invoca a la funcin main .d) Funcin que no invoca a otra funcin .

    2) El iodos los casos las funciones recursivas son ms eficientes que las funcionesiterativas.a) Verdaderob) Falso

    3) Qu sucede con el siguiente segmento de cdigo, cuando el valor del argumentoes 4?

    i n t f a c t o r j a I ( i n t n ) {i f ( n = = 0 )

    r e l u r n l ;e l s e

    r e t u r n f a c t o r i a l ( n - f ) * n ;)

    a) La funcin recursiva retorna 0.b) La funcin recursiva se ejecuta dentro de un bucle infinito.c) La funcin recursiva retorna elfactorialde -4.d) Nlinguna de las anteriores.

    4) El estado'le la funcin en la l lamada recursiva se mantiene ena ) Una p i l a .b) Un Heap.c) Un rbol.d) Ninguna de las anteriores.

    5) Las funciones recursivas siempre usan bucles inf initos.a) Verdaderob) Falso

    Unidad 3: Recursin Volumen 4: Funciones en C 48

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Prooramacin con C

    6) La recursin en el programa puede ser el iminada teniendoa) Bucles ror ejecutando un bloque de cdigo.b) Bucles white ejecutando un bloque de cdigo.c) Bucles do white ejecutando un bloque de cdigo.d) Todas las anteriores.

    7) Una funcin recursiva no necesita un caso base para estar bien definida y es capazde terminar por s misma.a) Verdaderob) Falso

    B) Recursin no requiere de un proceso repetit ivo.a) Verdaderob) Falso

    9) Indique que sucede cuando se l lama a una funcin recursivaa) La funcin se l lama a s misma con el valor modif icado de sus argumentos.b) Incrementa la eficiencia de un programa.c) Supera la l imitacin del nmero de veces que un ciclo for invoca a una

    funcin.d) El programa incrementa el rendimiento de la aplicacin.

    Volumen 4: Funciones en C Unidad 3: Recursin en C 49

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Respuestas a la Unidad 3: Examen de Autoevaluacin1 ) a2 ) b3) b4 ) as ) b6) d7 ) b8 ) b9) a

    Unidad 3: Recursin Volumen 4: Funciones en C 50

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    Unidad 4: Laboratorio de RecursinObjetivos de Aprend izajeAlfinal de esta unidad, usted ser capaz de:

    . Solucionar problemas usando la recursin como una tcnica.

    . Desarrol lar funciones recursivas en C para solucionar problemas especf icos.

    Volumen 4: Funciones en C Unidad 4: Laborator io de Recursin 51

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introouccin a la Programacin con C Gua del Estudiante

    Ejencicios de Laboratorio1) Escribir unra funcin usando recursin para imprimir los nmeros desde n hasta 0. n

    es un entero positivo que se obtiene como entrada.2) Escribir una funcin recursiva que imprima una lnea que contenga exactamente n

    asteriscos, n se da como entrada.3) Escribir una funcin recursiva que acepte un entero positivo como parmetro y

    devuelva un entero con dos ocurrencias de cada dgito, como salida invirtiendo elnmero a mostrar. Si por ejemplo, el nmero 123 es dado como entrada, la sal idadebe ser 332211.

    Volumen 4: Funciones en C Volumen 4: Funciones en C 52

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    Volumen 5: Punteros en C

    Volumen 5: Punteros en C Unidad 4: Laboratorio de Recursin 53

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Guia del Estudiante Introduccin a la Programacin con C

    Unidad 1: PunterosObjetivos de Aprend izajesAl f inal izar esta unidad, usted ser capaz de:. Definir punteros y describir su rol en la resolucin de problemas.. Discutir conceptos fundamentales de punteros, variables, direcciones de memoria y

    referencias.. Explicar cmo hacer declaraciones de punteros.. Discutir el uso de los punteros para pasar parmetros a las funciones por

    referencias.r Explicar funciones que pueden recibir arreglos unidimensionales como argumentos

    a travs de punteros.

    Volumen 5: Punteros en C Unidad ' l : Punteros 55

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    1. Fundamentos de PunterosEn el volunren anterior. se estudiaron las funciones en C. En este volumen se discutiruno de los conceptos ms importantes de C, los punteros.

    Un puntero es una variable en C que representa una direccin de un elemento de datosen la memoria. Un puntero apunta a una direccin en la memoria donde un elemento dedato int, un elemento ffoaL, un elemento char, un arreglo o una estructura sepueden encontrar. Los punteros son importantes porque:

    . Son ti les para crear aplicaciones.

    . Se pueden usar para pasar argumentos a funciones por referencia.

    . Son ti les para acceder a elementos individuales de estructuras de datos talescomo arreglos, estructuras y tipos de datos definidos por el usuario.

    . Se pueden usar para realizar asignacin dinmica de memoria, es decir,reservar tanta menroria como lo requiera la estructura de datos, en vez de estarl imitado por arreglos de dimensiones y tamao f i jos.

    Para entender el concepto de punteros, se discute que sucede cuando int x = 5; sedeclara en un programa.

    Este solicita al compilador de C que haga lo siguiente:. Asignar (o realmente reservar) mernoria para almacenar el entero.. Asociar el nombre x con la posicin de memoria.o Almacenar el valor entero 5 en esa posicin.

    La Figura 1.1 brinda una iepresentacin grfica de qu sucede con la declaracin inrx = 5;. Se proveen dos formas en las cuales la variable, contenido y la direccin sonreferenciados con uno de ellos especificados en parntesis.

    l iombre de lal :riable(lrlombre de ladireccin)

    Direccin de lavariable(Direccin de lavariable)

    X

    --.----}

    _______|' 43658Figura 1.1: Representacin Grf ica para inr x

    Valor en la posicin(Contenido de lavariable)

    -

    q '

    5

    Vol l l nen 5: Punteros rrn C Volumen 5: Punteros en C 56

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Prooramacin con C

    A continuacin considere lo siguiente:p r i n t f ( " ? d \ n " , x ) ;

    Se imprime elvalor s. Vase el siguiente segmento de cdigo:p r i n t f ( " ? u \ n " , & x ) ;

    E l cdigo anter iorno impr ime e l va lorde s , pore l contrar io impr ime e l va lor 436s8, e lcual es el nmero de la posicin actual de la variable x. A la variable x se le asignaruna posicin diferente en memoria para diferentes ejecuciones del mismo programa. Enprintf, se us el especif icador ?u que signif ica un entero sin signo, ya que lasdirecciones son siempre posit ivas y almacenadas en una celda de memoria sin el bit designo. El operador & es el operador de referencia o 'direccin de'.

    Ahora se le asigna &x a otra variable.var_nombre = &x;

    Como se vio &x se refiere a la direccin de memoria de x en vez de su valor. Sinembargo, var nombre ahora apunta a la direccin de la ubicacin donde el valor de xest almacenado, que en este caso es un int. La Figura 1.2 muestra que var nombreapunta a memoria.

    nombre

    Figura 1.2: Relac in entre var-_nombre y x

    1.1. Acceder a Valores Usando Punteros

    Se puede acceder al valor de la variable x usando el operador de indireccin. El " seusa como operador de indireccin en C. Tambin se le denomina operador de'desreferencia'. El operador de indireccin provee el valor de la variable xindirectamente a travs de la variable puntero. Por lo tanto, se puede acceder al valorde x como *var_nombre. Ahora bien, si se escribe la siguiente sentenciap r in t f ( "?d \n " , * va r_nombre ) , se impr ime 5 . De manera que ambos x y*var_nombre se refieren al mismo elemento de datos (es decir, el contenido de lamisma posicin de memoria). Considere las siguientes sentencias:

    va r_nombre = &x ;

    Y = * va r -nombre ;

    La primera sentencia coloca la direccin de x (o el puntero de la posicin de x) en lavar_nombre. La segunda sentencia y = *var nombre busca el valor de x, el cuales 5, usando *var_nombre y lo asigna a y.

    Volumen 5: Punteros en C Unidad 1: Punteros 57

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

    Valor de x, que es, 5

  • Introduccin a la Programacin con C Gua del Estudiante

    Una variable puntero debe ser declarada antes de que sea usada. En general, unadeclaracin de puntero se hace como sigue:

    t . i po - de - da to * va r i ab leSunLero ;

    El t ipo-de-dato se refiere al t ipo de dato de la variable en consideracin (variableapuntada), y la varl able_punLero es el nombre de la variable puntero que se estdeclarando. Note que se debe rreceder el nombre de la variable puntero con uncarcter *. Las siguientes son algunas declaraciones vlidas de punteros:

    int *nombre_var;f l o a L * L e m p ;

    c h a r * p v a l ;

    An cuando las declaraciones anteriores apuntan a diferentes t ipos de datos, lasvariables punteros slo pueden contener direcciones.

    Se puede inicial izar una variable puntero en la misma declaracin tal como se muestra acontinuacin:

    i n t x , y ;i n t *nombre vL = &x ;

    En este caso, se le asigna la direccin de x a la variable nombre_var. En esteejemplo, se han declarado dos variables enteras x e y, y la variable punteronombre_var apuntando a una cantidad entera. Se puede tambin tener la siguientedeclaracin, tal como se hizo con otras variables en C:

    i n t x , y ;

    in t *nombre_var, '

    nombre_va r = &x ; / * Se }e as igna l a d i recc in de x * /

    Aqu , a nombre_var se le as igna la d i recc in de x.

    Nota: En la sentencia de asignacin, no se precede a la variable nombre var con elcarcter *.

    2. Uso de Punteros para Pasar Argumentos a FuncionesEn C, el mtodo normal de pasar argumentos a funciones es a travs de parmetros porvalor. Cuando se pasa un argumento como un valor a una funcin, se hace una copiadel elemento de dato dentro de la funcin. Dentro de la funcin todas las referencias; alos argumentos a travs de los parmetros fornrales son dirigidas a la copia. De maneraque si se modifica este elemento de dato, es la copia dentro de la funcin la que esmodificada y no la usada en la llamada. El efecto de esta modificacin no puede serl levada a cabo sobre el programa que l lam a la funcin. Si esto es as, cmo se

    Volumen 5: Punteros en C Volumen 5: Punteros en C 58

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    puede escribir una funcin l lamada s\^/ap que tome dos variables enteras comoargumentos e intercambie su contenido?.

    Una de las funciones importantes de los punteros es que permiten pasar argumentospor referencia, la cual contiene la direccin del argumento, a una funcin. Este pase porreferencia se hace con punteros. Por pasar punteros a funciones como argumentos, sepasa una referencia en vez de un valor. El parmetro formal correspondiente debe serdeclarado especf icamente con un asterisco * precedindolo.

    Se sabe que cuando se usan las siguientes funciones, se estn pasando argumentos alas funciones como valores (o parmetros por valor).

    p r . i n L t ( " H o 1 a \ r r " ) ;p r i n t f ( " ? d \ n " , a ) ;p r n t f ( " Z f " , 2 * s q r t ( a / d ) ) ;y = f a c t o r i a l ( 1 0 0 ) ;y = f a c t o r i a l ( 2 * a ) ;

    Cuando un argumento se pasa como una referencia (es decir, cuando un puntero sepasa a una funcin), la direccin del elemento de dato se pasa a la funcin y no suvalor. El contenido de la posicin (es decir, el elemento de dato) se puede acceder sinninguna restr iccin dentro de la funcin. Si se hace cualquier modif icacin al elementode dato (el contenido de la posicin de memoria) usando este puntero, los cambiosrealizados sern reflejados tanto dentro de la funcin como en el programa que estl lamando a la func in.

    Cuando un puntero se usa como un argumento, ofrece el acceso y la capacidad dealterar las variables globalmente desde dentro de la funcin. Sin embargo, se debe sercuidadoso cuando se pasan punteros como argumentos, ya que son capaces demodif icar elementos de datos en la funcin que l lama. Esto puede algunas vecesresultar en un efecto de ondas de cambios en otras partes del programa.

    A continuacin se presentan algunos ejemplos para entender cmo trabajar conpunteros.

    Ejemplo 1.1: Funcin para Intercambiar VariablesEl problema es escribir una funcin para intercambiar el contenido de dos variablesenteras. Se invoca la funcin como sigue:

    i n t e r c a m b i a r ( t x , & y ) ;La funcin intercambiar para realizar esta tarea es como sigue:

    v o i d i n l e r c a m b i a r ( j n t * p , i n L * q ) {/ * N o L e 1 o s a r g u m e n t o s f o r m a l e s * /

    i r - r t temp;

    / * C o n t e n i d o c l e p s e a - L m a c e n a e n t e m p * , /

    Volumen 5: Punteros en C Unidad 1: Punteros 59

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • lg,tOr".On, t, Ptogrt Gua del Estudiante

    t e m p = * p ;

    / * Conten ido de q se mueve a p " /

    * p = * 9 , '

    / * C o n t e n i d o d e t e m p ( p ) a q * /* q = t e m p ;re tu rn , '

    )Los comentar ios expl ican el trabajo de la funcin completamente.

    F in de l e jemplo 1 .1

    Generalnrente, una funcin toma varias entradas y produce una sal ida de un solo valor.As r-1ue, las entradas pasadas como argumentos a la funcin no deben ser modificadasdentro de la funcin. An si se modif ican. sus consecuencias no deben afectar afuera alprograma que l lam a la funcin.

    Esto se debe a que todos los parrnetros para una funcin en C son pasados por valor.En el caso que un valor modificado tiene que ser reflejado fuera en el programa quellarna a la funcin, una referencia (puntero) se pasa a la funcin. En la funcinintercarnbiar, x e y se det; laran como variablcs punteros.

    En el prximo ejenrprio, se presenta cmo se pasa un arreglo como un parmetro a unafunr; in.

    Ejemplo 1.2: Sumar todos los Nmeros lmpares en un ArregloConsidere un arreglo unidimensional l lamado vecror, que t iene 100 elementosenteros. Se va a escribir una funcin sum_irnpar, que toma un vector como entrada yretorna la suma de trrdos sus elementos impares. La funcin main ser como sigue:

    ma in O {i n t v e c t o r [ 1 0 0 ] ;

    p r i nL f ( "La suma de f os e l_emen tos impares es ?d \n ' , , \sum impar ( vec to r ) ) ;

    El prototipo de funcin y el argumento formal a la funcin se escribe como sigue:i n t s u m _ i m p a r ( i n t . w e c t o r [ ] ) ; / * N o s e e s p e c i f i c a t a m a or*

    ,/

    Tambin se puede escribir como sigue:/ * Bcr i to usando not-ac in de punteros * /

    Volumen 5: Punteros en C Volumen 5: punteros en C 60

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    i n t sum_ impar ( i n t * vec to r ) ;Ambas son formas correctas de especif icar la declaracin de la funcin cuando unarreglo se pasa como un argumento. El lt imo se usa con ms frecuencia que elpr imero. En ambos casos, inL vector lJ y *vector dec laran s lo un puntero comoel argumento formal. El punto importante a notar aqu, es que en C los arreglos sepasan a las funciones slo como referencias. El nombre del arreglo contiene la direccinbase, la cual es la direccin del primer elemento del arreglo. Esta direccin base sepasa a la funcin. De manera que, cualquier modif icacin que se haga en la funcin auna arreglo se refleja en la funcin que la invoc.La funcin para este ejemplo de presenta a continuacin:

    i n t sum_ impar ( i n t * vec to r ) {rn t su r l l = 0 , k ;

    / * E l buc le ca f cu la l a suma de l os nmeros impares defos e lemen tos de un a r re -g lo ff o r ( k = 0 ; k < 1 0 0 ; k + + )

    / * v e r i f i c a s e l e l e m e n t o d e s i r n p a r o n o * fi f ( v e c t o r l k l Z 2 ! = 0 )

    sum = sum + vec to r [ k ] ;r e t u r n ( s u m ;

    )Fin del Ejemplo 1.2A continuacin se discute cmo pasar arreglos a la funcin scanf .

    2.1. Pasar Arreglos a scanf ( )Se sabe que para leer var iab les in t , f loat , y char se debe usar la func in scanfprecedidas por un carcter &, tal como se i lustra a continuacin:

    i n t x ; f l o a t p ; c h a r c h ;s c a n f ( " % d % f % C " , & x , & p , & c h ) ;

    Sin embargo, cuando se intenta leer cadenas en un arreglo, scanf no requiere elcarcter e .

    c l ra r f nombre [45 ) ;s c a n f ( * e s " , f n o m b r e ) ; / * m t e s e q u e n o s e u s a & * /

    scanf requiere la direccin de manera que los elementos de datos se puedanalmacenar en la ubicacin correcta. Por lo tanto se debe suministrar como &x, &p y&ch. Dado que f no.nbre es el nombre de un arreglo que representa una direccin, yno un elemento de dato o un valor, este no debe estar precedido por un & en scanf .

    Volumen 5. Punteros en C Unidad 1: Punteros 61

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    A continuacin, se estudia cmo se pueden calcular las direcciones en los arreglos yubicar elementos individuales en los arreglos. Tambin se aprender como lossubndices y direcciones trabajan juntos.2.2. Aritmtica de Direcciones

    Se va a discutir brevemente la aritmtica de direcciones. Una discusin ms detal ladase da en la Unidad 3 - Punteros Avanzados de este volumen. Un nombre de arreglo esrealmente un puntero al primer elemento del arreglo. Si caja es un arreglounidimensional, la direccin del primer elemento puede ser referenciado como&caja[0J o slo caja. Las direcciones de los otros elementos se pueden obtenercomo sigue:

    2' i" elemento3" elemento

    imo elemento( i+1 )mo e lemen to

    e c a j a [ 1 ]a c a j a [ 2 J

    & c a j a t i - 1 1c c a j a I i ]

    o ( c a j a + 1 )o ( c a j a + 2 )

    i - 1 )i )

    Ahora se t ienen dos formas de escribir las direcciones de los elementos de un arreglo,a c a j a l i J ! c a j a + i . N o t e q u e l a e x p r e s i n c a j a + i v a a s e r t r a t a d a c o m o u n aexpresin especial que suma la direccin del primer elemento de caja e i . Por lotanto, la expresin caja + i es una representacin simblica de una especif icacin dedireccin, en vez de una expresin aritmtica. Se puede usar esta expresin sinimportar el t ipo de elementos en el arreglo. Esto signif ica que la expresin caja + iser vlida para variables char (que toma un byte por elemento) as como f loar (quetoma B bytes por elemento).El subndice i tambin se l lama desplazamiento (offsef) en este cclntexto. Si ecaja t iJ! (ca ja + i ) se ref ieren a la misma d i recc in, entonces ca ja I iJ y * (ca. ja + i )deben referir al mismo contenido de las direcciones, es decir, el valor del ( i+1)moelemento de ca j a . Entender este concepto proporciona suficiente informacin parapoder escribir funciones que tomen un arreglo unidimensional como entrada y actuarsobre ste. Los siguientes dos ejemplos i lustran este punto.Ejemplo 1.4: Encontrar Elementos en un Arreglo Usando una Bsqueda LinealConsidere un arreglo de enteros l lamado ca j a que t iene 100 elementos. El problema esescribir una funcin l lamada busqueda que tome como entrada la direccin del primerelemento del arreglo, el nmero total de elementos en el arreglo y el nmero que sedesea buscar. La funcin retorna la posicin en el arreglo en el cual el nmero que sebusca se encontr. o -1 si el nmero no se encontr.

    Se usar un algoritmo simple, donde la bsqueda se comienza desde el primerelemento en el arreglo y se contina buscando a travs del arreglo hasta que el

    Volumen 5: Punteros en C Volumen 5: Punteros en C 62

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    elemento se encuentre o hasta que se haya recorrido todo el arreglo. Esto se l lamabsqueda l ineal, ya que se busca desde el primer elemento hasta el lt imo elemento, ohasta que el elemento se encuentra en el arreglo.

    i n t b u s q u e d a ( j n L * c a j a , i n t n , i n t n u m b ) {/ * n e s e 1 L a m a o d e 1 a r r e q l o , n u m b e s e l n m e r ob u s c a d o * /

    i n t k ;

    k = O ; / * D e s p l a z a m i e n t o p a r a e l a c c e s o a f a r r e g l o * /

    w h i l e ( k . n ) {i f ( * ( c a j a + k ) = = n u m b )

    r e L u r n ( k ) ;e l s e

    k + + , '

    )/ * E ] c o n t r o l d e l p r o g r a m a s e a l c a n z a a q u c u a n d o e lnumb no se encon t , r * /

    r e L u r n ( - 1 ) ;)

    En el parmetro formal, se recibi la direccin del primer elemento del arreglo caja. Laexpresin * (caja + k) ayuda a acceder secuencialmente los elementos del arreglode turno, ya que k va desde 0 hasta n-r. Inicialmente, cuando k es o, se estrealmente refir iendo al primer elemento del arreglo. Cuando k es 1, se accede alprximo elemento, y as sucesivamente. En un bucle i terativo, si todos los elementos delarreglo se buscaron y no se encontr el nun, slo se hace reLurn (-1) para indicarque el elemento no se encontr.

    El siguiente es el programa completo que implementa la bsqueda l ineal:

    E l cdigo C inc ia aqu . . .1 . # i n c l u d e < s L d i o . h >'2

    . i n t busqueda ( i n t * ca j a , r n t t am, i n t num) , '3 . m a i n O {4 . i n t c a j a [ 1 0 0 ] , k , t a m , n u m , '5 . / * L e e r e I t a m a o d e f a r r e g l o * /

    6 . p r i n t f ( " I n g r e s a r e ] t a m a n i o d e l a r r e g l o [ 1 , 1 0 0 ] \ r ' r " ) ;7 . d o {B . s c a n f ( ' r e d r r , & t a m ) ;9 . ) w h i l e ( t a m < 1 l l t a m > r 0 0 ) ;1 0 . / * L e e r e f a r r e g l o m i s m o * /

    Volumen 5: Punteros en C Unidad 1: Punteros 63

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    , o parcialmente sin el permiso previo escr i to de IBM

    t

  • Introduccin a la Programacin con C Gua del Estudiante

    1 1 . i : o r ( k = 0 ; k < t a m ; k + + ) {1 2 . p r i n t f ( " I n g r e s a r l - o s e l e m e n t o s d e l \1 3 . a r r e q l o ? d \ n " , k ) ;1 4 . s c a n f ( " 9 d " , & c a j a [ k ] ) ;1 s .

    - lL 6 . / * L e e r e I n m e r o a s e r b u s c a d o * /

    1 , ' 7 . p r i n t f ( " I ng resa r e1 numero a busca r \n " ) ;1 8 . s c a n f ( ' t ? d " , & n u m ) ;1 9 . / * I n v o c a r b s q u e d a e i m p r i m i r e f r e s u l t a c l o * /

    2 0 . i f ( b u s q u e d a ( c a j a , t a m , n u m ) - 1 )2 I . p r i n t f ( " % d n o f u e e n c o n t r a d o e n e l \2 2 . a r r e q l o \ n " , n u m ) ;' 2 3 .

    e l s e

    2 4 . p r i n t f ( " % d f u e e n c o n t r a d o e n e l a r r e g l o \ n " , n u m ) ;I2 3 . I

    2 6 .

    2 7 . i n t b u s q u e d a ( i n t * c a j a , i n L t a m , i n t n u m ) {2 8 . i n t k = 0 ;2 9 . w h i l e ( k . t a m ) {3 0 . i f ( * ( c a j a + k ) = = n u m )3 1 . r e t . u r n ( k ) ; / * n u m e n c o n t r a d o e n k * /3 2 . e l s e

    3 3 . k + + ;3 4 . ]3 5 . r e t u r n ( - 1 ) ; , / * n u m n o e n c o n t r a d o * /3 6 . )

    El cdigo C f inal iza aqu

    Fin del Ejemplo 1.4En el ejemplo anterior, se ha pasado elarreglo como argumento a la funcin busqueda.La direccin del primer elemento del arreglo se pasa a la funcin, la cual es aceptadacomo un puntero en la funcin.

    Ejernplo 1.5: Intercambiar los Elementos de un ArregloConsidere in t ca ja[100] como la ent rada. Se debe escr ib i r y usar una func inllamada int.ercambiar, la cual coloca el arreglo de elementos en orden inverso. Un

    Volumen 5: Punteros en C Volumen 5: Punteros en C 64

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Prooramacin con C

    algoritmo simple para esto es considerar el primer elemento (tope) y el lt imo elemento(base), e intercambiar sus contenidos. Entonces se mueve al prximo elemento desdeel tope y al elemento previo a la base e intercambian sus contenidos. El procesocontina hasta que la mitad del arreglo se haya recorrido. El siguiente programa realizaesa la tarea:

    Elcdigo C in ic ia aqu . . .1 . # i n c l u d e < s t d i o . h >2 . v o i d i n t e r c a m b i a r ( i n t * c a j a , i n t n ) ;3 . v o i d c a m b i a r ( i n t * X , i n t * y ) ;4 . m a i n O {5 . i n t - c a j a [ 1 0 0 ] , k , n , .6 - / * Lee r e l t amao de f a r regLo * f7 . p r i n t f ( " I n g r e s a r e l t a m a n i o d e l a r r e g l o [ 1 , 1 0 0 ] \ n " ) ;B . d o {9 . s c a n f ( r r e d r r , & n ) ;1 0 . i w h i l e ( n < 1 l l n > 1 0 0 ) ;1 1 .

    1 2 . / * L e e r e f a r r e g l o m i s m o * /

    1 3 . f o r ( k = 0 ; k < n ; k + + ) {7 4 . p r i n t f ( " t n g r e s a r e I e l e n r e n t o ? d d e L \1 5 . a r r e g l o \ n " , k ) ;1 , 6 . s c a n f ( r r e d r r , & c a i a [ k ] ) ;r / . )1 8 .

    1 9 . / * I m p r j m i r e l a r r e g l o e n s u f o r m a o r i g i n a t * /2 0 . p r i n l f ( " I m p r i m i r e l a r r e g J - o o r i g i n a - L \ n " ) ;2 a . f o r ( k - 0 , ' k < n ; k + + )2 2 . p r i n t f (

    " ? d \ n " , c a j a [ k J ) ;

    ; ; / * r n v e r t j r e 1 o r d e n d e t a r r e g J o * , /2 5 . i n t e r c a m b i a r ( c a j a , n ) ;2 6 . / * T m p r i m i r e I a r r e g l o i n v e r t i d o * /

    2 1 . p r i n L [ ( " E ] a r r e g l o i n v e r l j d o e s : \ n " ) , '2 8 . f o r ( k = O ; k < n ; k + + )2 9 . p r i n t f ( " ? d \ n " , c a j a [ k J ) ;3 0 . )

    Volumen 5: Punteros en C Unidad '1: Punteros 65

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Oua del Estudiante

    32 . / * Func in que i n te rcamb ia va lo res * /

    3 3 . v o i d i n t e r c a m b i a r ( i n t * c a j a , i n t n ) {3 4 . i n t t o p e - 0 , b a s e , '

    3 5 . b a s e - n - L ;

    3 6 . w h i l e ( t o p e < b a s e ) {3 7 . c a m b i a r ( c a j a + t o p e , c a 1 a + b a s e , ) , '3 8 . t o p e + + ;

    3 9 . b a s e - - ;

    4 0 . )4 I . r e L u r n ;

    4 2 . )4 3 .

    4 4 . / * F u n c i n q u e c a m b i a l o s v a l o r e s * /

    4 5 . v o i d c a m b i a r ( i n t * p , i n t * q ) {4 6 . i n t t e m p ;4 7 . t e m p = * p ; / * C o n t e n i d o d e p a f m a c e n a d o e n t e m p * ' 7

    4 8 . * p = * q ; / * C o n t e n i d o d e q m o v i d o a p * /

    4 9 . * q = t e m p ; / * C o n t e n i d o d e t e m p ( p ) a q " /5 0 . r e L u r n , '

    s 1 . )El cdigo C termina aqu

    Volumen 5: Punteros en c Volumen 5: Punteros en c 66

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante lntroduccin a la Prooramacin con C

    ResumenAhora que ha completado esta unidad, usted ser capaz de.. Definir punteros y describir su rol en la resolucin de problemas.. Discutir los conceptos fundamentales de punteros, variables, posiciones de

    memorias y referencias.. Explicar cmo hacer declaraciones de punteros.. Discutir el uso de punteros para pasar parmetros a funciones por referencia.. Explicar funciones que pueden recibir arreglos unidimensionales como argumentos.

    a travs de punteros.

    Volumen 5: Punteros en C Unidad 1. Punteros 67

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Progranlacin con C Gua del Estudiante

    Unidad 1:Examen de Autoevaluacin1) En el parmetro formal de una funcin, Cmo se declara arreglo?

    a) int *arreglob) int arreglofic) int arreglod) Todas las anteriores.

    La direccin de memoria de una variable entera puede ser un flotantea) Verdaderob) Falso

    Cules de las siguientes son formas correctas de declarar un puntero a entero?a) in t x ;b) in t *x ;c) int "x = 3;d) Ninguna de las anteriores.

    4) Cules de las siguientes son formas correctas de declarar un puntero a flotante?a) l toat x;b) f loat *x;c) f loat *x = 3;d) Ninguna de las anteriores.

    Cules de las siguientes sonse declara?a) scanf("%c",&caja[0]);k)) scanf("%s", &caja);c) scanf("%s", caja);d) Ninguna de las anteriores.

    usos vlidos, cuando el arreglo char ca ja t10]

    2)

    3)

    5)

    6) Variables punteros como int, f 1oat, char puedena) Verdaderob) Falso

    solo almacenar direcciones.

    \ 'l'.men 5: Punteros en C Volumen 5: Punteros en C 68

    @ Copyright IBM Corp. 2000Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Proqramacin con C

    7) Cuando un arreglo se pasa a una funcin como un parmetro, qu se pasa alarreglo?a) Los contenidos del arreglo.b) El contenido del primer elemento del arreglo.c) La direccin del primer elemento del arreglo.d) Ninguna de las anteriores.

    B) En la l lamada a la funcin f i ( ep ) , la direccin de una ubicacin de memoria seest pasando a la funcin.a) Verdaderob) Falso

    9) Para la dec larac in inr a t1o0l e inr j , culesde loss igu ienteses unaexpresin especial, y no una expresin aritmtica regular.a) (a * j )b) ( .a + j )c) .(a + j)d ) ( . a + . j )

    1 0 ) P a r a l a d e c l a r a c i n l n r a t 1 o 0 l e i n r j , l a e x p r e s i n * ( a * j ) e s e q u i v a l e n t e ala referenciaa ) aU-11b) a[ j+ 1]c) ad) alll

    Volumen 5: Punteros en C Unidad 1: Punteros 69

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Respuestas a la Unidad 1: Examen de Autoevaluacin1 ) a y b2 ) b3) b4) b5 ) a y c6) a7 ) c8) a9 ) c

    1 0 ) d

    Volumen 5: Punteros en C Volumen 5: Punteros en C 70

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    Unidad 2: Laboratorios de PunterosObjetivos de Aprend izajeAl f inal izar esta unidad, usted ser capaz de:

    . Usar punteros para manejar soluciones a problemas.

    . Escribir programas en C que implemente algoritmos que involucran el uso depunteros

    . Pasar arreglos unidimensionales a funciones usando punteros.

    Volumen 5: Punteros en C Unidad 2: Laborator ios de Punteros 71

    O Copyright IBM Corp 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Ejercicios de Laboratorio1) Considere un arreglo unidimensional que contiene un mximo de 100 enteros.

    Escriba las siguientes funciones:a) leer_enLrada lee los valores del arreglo del usuario, dado el nmero de

    elementos a ser ledos.b) ordenar_ascendente toma como entrada un puntero a un arreglo, la

    posicin de inicio y f in del arreglo, adems ordena los elementos en ordenascendente.

    c) ordenar_descendente toma conto entrada un puntero a un arreglo, laposicin de inicio ! f in del arreglo, adems ordena los elementos en ordendescendente.

    d) imprimir_salida toma un puntero a un arreglo como entrada N e imprime elarreglo en la forma tal conro est.

    Escribir una funcin main que ingrese los valores del arreglo, imprima el arreglooriginal, ordene la primera mitad del arreolo en orden ascendente, la segundanlitad en orden descendente e !:": ' ;prima elarreglo resultante.

    Volumen 5: Punteros en C Volumen 5: Punteros en C 72

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Prooramacin con C

    Unidad 3: Punteros AvanzadosObjetivos de Aprend izaeAlfinal izar esta unidad, usted ser capaz de:

    . Explicar la aritmtica de direcciones.

    . Describir un puntero a puntero y un arreglo de punteros.

    . Discutir cmo declarar y usar punteros con estructuras.

    . Explicar cmo pasar funciones como argumentos a otras funciones a travs depunteros.

    Volumen 5: Punteros en C Unidad 3: Punteros Avanzados 73

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    1. lntroduccinLos punteros son importantes en cualquier esfuerzo para resolver problemas, tal comose estudi en la Unidad 1 - Punteros. En esta unidad, se aprender un poco ms acercade los punteros y sus usos. Para recalcar, se puede declarar un puntero para cualquiert ipo de dato. Se sabe que C provee t ipos de datos estndar como int, f f oat o char.Adems le otorga la posibi l idad al programador de declarar t ipos de datos definidos porel usuario. Estos se definen con la ayuda de estructuras y de la palabra reservadarypedef. Dado que los t ipos de datos definidos por el usuario estn permit idos, Cpermite usar punteros a estructuras.

    Debido a que el puntero es otro tipo de dato en C, se le debe permitir al programadordeclarar un puntero de este tipo de dato. A veces es necesario pasar funciones comoargumentos a otras funciones. Esto slo puede hacerse con la ayuda de punteros, aldeclarar un puntero a funciones. Se comienza esta unidad con una explicacin paraentender la aritmtica de direcciones.

    2. Aritmtica de DireccionesSe sabe que un tipo de dato es un conjunto de valores ms /as operaciones definidassobre e//os. Considere la siguiente declaracin:

    i n t * p t r ;

    Esto indica Qu ptr es una variable que pertenece alt ipo de dato int *. int * es delt ipo de dato puntero. La variable puntero ptr puede contener cualquier valor quecorresponda a una posicin en la memoria y que pertenece al t ipo de dato entero.Lenguaje C permite slo dos operaciones, adicin y resta, sobre las variables puntero.Lo importante acerca de los punteros es que la variable puntero est asociada con untipo de dato. Por lo tanto, se puede declarar lo siguiente:

    . i n t * i p t r ; c h a r * c p t r ;

    e f I o a L * f p t . r ;

    Estas tres variables punteros son diferentes en cuanto a su naturaleza, an cuandotodas almacenan la direccin de una posicin en la memoria. Para entender laaritmtica de direcciones, elt ipo de dato al que el puntero est asociado es signif icante.Este es el tamao del t ipo de dato que se usa en el clculo de la expresin queinvolucra aritmtica de direcciones.

    La aritmtica de direcciones se usa para mover el puntero a la prxima posicin en lamemoria (donde la asignacin de memoria contigua es fundamental), para acceder alelemento almacenado en esa posicin. La aritmtica de direcciones normalmente seaplica cuando se usa con arreglos. La aritmtica de direcciones no se puede usar contipos de datos como int o char, porque el contenido de la prxima posicin no se

    Volumen 5: Punteros en C Volumen 5: Punteros en C 74

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    conoce. Tanto los arreglos unidimensionales como los bidimensionales se almacenanen posiciones de memoria contiguas.

    2.1. Operacones Usando Punteros

    Es interesante notar cmo C integra punteros, arreglos y aritmtica de direcciones. Losarreglos en C implcitamente usan aritmtica de direcciones para acceder a suselementos. Se discutir al respecto posteriormente. A continuacin se presenta ladeclaracin de un arreglo de enteros que se usar en la discusin:

    i l r l a r r e g l o [ 1 0 ] = { f 0 , 2 0 , 3 0 , 4 0 , 5 0 , 6 0 , J 0 , 8 0 , 9 0 , 1 0 0 } ;i n t * p L r - a r r e g l o ;

    Se sabe que el nombre de un arreglo almacena la direccin de su o"r1sir. elemento.Esta direccin se asigna a la variable puntero pLr, como se muestra en la Figura 3.1.

    Direccinde Memoria

    de laPosicin

    10281 03010321 0341 0361 0381 040104210441 046

    Figura 3.1: Direcciones de la Variable Puntero ptr

    Ambos arreglo y pt r apuntan a l pr imer e lemento de arreglo. Se puede usarcualquiera de las siguientes cuatro formas para acceder a los elementos de arreglo:

    . a r r e g l o I i ]

    . * ( a r r e g l o + i )

    . p r r I i Jr * ( p t r + i )

    Volumen 5: Punteros en CI

    Unidad 3: Punteros Avanzados 75

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

    Elemento

    1 020JU

    40506070BO901 0 0

  • Introduccin a la Programacin con C Gua del Estudiante

    En los cuatro mtodos se obtiene el valor almacenado en la posicin (i+1)lesrma en.rr.cegto. El lenguaje C aplica aritmtica de direcciones para recuperar el valoralmacenado en la posicin (i+1)iri irna. Para entender cmo se hace, vase la sintaxisde las tres posibles operaciones sobre los punteros:

    + - -

    2.2. Usar el Operador de Adicin con Punteros

    En la primera operacin, la direccin en la variable puntero se toma y se mueve por elnmero representado por un operando entero. Considere lo siguiente:

    p t r + 4 ;

    El valor retornado es otra direccin, la cual se calcula como sigue:p t - r + 4 * s i z e o f ( t i p o - d e - d a t o )

    Si el tipo de dato es un entero, y se asume que dos bytes (se asumir esto para elresto de la unidad) son asignados por el sistema operativo para cada entero, ladireccin retornada ser:

    p t r + 4 * 2

    Esto es equivalente 3 prr + B

    De este modo, si a ptr se le ha asignado la direccin ro2l, la expresin ptr + 4resultar en 1036, donde el 5t" elemento est disponible. Note que 1036 - 1028 esocho bytes, y dado que cada entero ocupa dos bytes, el nmero actual de elementospasado es slo cuatro. Esta es la razn porque el tipo de dato asociado con unavariable puntero es importante.

    2.3. Usar el Operador de Resta con Punteros

    La segunda operaci, -

  • Gua del Estudiante lntroduccin a la Prooramacin con C

    i se debe usar el operador de desreferencia *. As se indicar * (arreglo + i) v* (ptr + i) respectivamente.arreglot i l y p t r I i ] son d i ferentes formas de expresar * (ar reglo + i ) ] * (p t r + ) , respect ivamente. As , cuando se d ice prr t i l , e l compi lador est rea lmenterealizando el siguiente clculo:

    * ( p t r + i * s i z e o f ( t i p o d e d a t o ) )

    En e l e jemplo, pr r [4 ]e l e lemento en la quinta pos ic in es recuperado usando laf rmu la . (p t r + 4 .2 ) que es so . Aqu , a r reg lo con t i ene l a d i recc in roze . Po r l o que1o2B + 4 * z da 1036, y * (1036) da e l e lemento que est a lmacenado en esadireccin de memoria, el cual es 50.

    Nota: Usando el operador de desreferencia de la direccin se obtiene el elernento deesa posicin.

    Simi larmente, ar regro[4] tambin recupera e l e lemento 50, ya que usa la mismafrmula subyacente para acceder al elemento.

    Sea el siguiente segmento de cdigo.n l - r - r r o l n .t J l +

    p t r = p t r + 4 ;

    p r i r r t f ( " % d \ n " , * ( p L r ) ) ;p t r = p t r - 2 ;

    p r i n t f ( " % d \ n " , * ( p t r ) ) ;

    / * 1 o 2 B a s i g n a d o a p t r * f

    / * n f r I e e s . h ^ - - . ^ ; ^ - ^ ^ 1 C a 6/ v L r f g c b a r r u ! a a D r Y l q u v l \

    / * s a f i d a 5 0 * // * n t r l e e s a s i c n d n : h r r a 1 0 3 2/ y u r e

    / * l a s a l i d a e s 3 0 * /

    Ya que ptr es una variable puntero, a sta se le puede reasignar nuevos valores. Sepuede mover hacia arriba o hacia abajo en el arreglo. Sin embargo, se debe tenercuidado de no acceder a elementos ms al l de los l mites del arreglo ya que C no t ieneun mecanismo incorporado para la verif icacin de los l mites del arreglo. El programadordebe ser, por lo tanto, muy cuidadoso. Tome por ejemplo, las siguientes declaraciones:

    p t r = p t r - 4 ;* ( p t r = * ( p t r ) + 1 0 ;

    Se as ignar dentro de pt r e l va lor ro24, y un va lor 10 ser sumado a l e lemento en esaposicin. Sin embargo, Lo24 no est dentro de los l mites del arreglo que se hadeclarado, el cual comienza a partr de roze. Ms an, con este uso incorrecto de laresta en pLr se pudo haber modif icado el valor de alguna otra variable que no sedebera modif icar. A pesar de que los punteros son extremadamente ti les en ciertas

    Volumen 5: Punteros en C Unidad 3: Punteros Avanzados 77

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    situaciones, estos pueden ser una pesadil la para el programador si se usanincorrectamente.

    Para entender las operaciones de resta cuando dos variables punteros estninvolucradas, vase la siguiente declaracin:

    i n t a r r e g l o t l o l = { t 0 , 2 0 , 3 0 , 4 0 , 5 0 , 6 0 , 7 0 , 8 0 , 9 0 , t 0 0 } ;i n t * p t r 1 = a r r e g l o ;i n t * p t - r 2 = a r r e g l o + 5 ;

    Se han declarado dos variables punteros, cada una asignada r dos diferentesposiciones

    n arreglo. Se muestra en la Figura 3.2.

    Direccinde

    Memoriade la

    Posicin10281 03010321 0341 0361 0381 040104210441 046

    Figure 3.2: Dos Variables Punteros

    La expresin ptrz - ptr l resultar en un valor entero equivalente al nmero cleobjetos presentes entre estas dos variables. El clculo se realiza como sigue;

    ( p t r Z p t 1 1 ) / s i z e o f ( t i p o d e d a t . o )

    Esto es igual a (1038 - 1028)12 = 1Ol2 = 5Esto signif ica que hay cinco datos enteros desde prrl d prr2. La suma devariables punteros no es significativa por razones obvias.

    Se present en la seccin anterior como se realiza la operacin de adicinpunteros. Hasta ahora se ha visto que usar el nombre del arreglo cuando se

    las dos

    usandorealizan

    Volumen 5: Punteros en C Volumen 5: Punteros en C 78

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante lntroduccin a la Prooramacin con C

    operaciones de aritmtica de direcciones es lo mismo que usar el nombre de unavarable puntero ( la cual apunta al arreglo) para la misma operacin. Sin embargo, laoperacin de resta no debe ser ejecutada con el nombre del arreglo. El compiladorreserva memoria para un arreglo, y el espacio ocupado por el arreglo durante laejecucin del programa no debe alterarse. El nombre del arreglo contiene la direccindel primer elemento, el cual no puede ser cambiado durante la ejecucin del programa.As, se puede decir que el valor de la direccin mantenida en el nombre del arreglo, esuna constante, y el nombre del arreglo signif ica un puntero constante. Restar un valor aeste puntero constante no tendra sentido, ya que resultar en una direccin que nocoexiste con la direccin usada en la operacin. Sea por ejemplo la siguientedeclaracin:

    a r r e g l o - 4

    Esta resulta en una posicin que est antes de rozB, que no es parte del arreglo que seha declarado, teniendo en cuenta que usar resta en arreglos no t iene sentido.

    Ahora se aprender como declarar un puntero a un puntero.

    3. Puntero a PunteroHay que recordar que una variable puntero es una variable que contiene la direccin deotra variable. La variable puntero en s misma puede apuntar a otro puntero, implicandoque se puede tener un puntero a un puntero.

    Sea la declaracin de alounas variables:1 r 1 l - v * \ / * * 7 ., Y , l . r ,

    Se sabe que x es una var iab le entera, e y es una var iab le puntero entera. **z ind icaque es un puntero a una variable puntero entera. Asuma que x est en la posicin 508,y contiene 10. Se muestra en la Figura 3.3.

    X L Is 0 B

    Figura 3.3: Direccin y Contenido de una Variable Puntero

    Suponga que se realiza la siguiente sentencia:

    Y = & x ;

    Se asume que y est almacenada en memoria en la posicin 1024. La posicin dememor ia de x e yse muestran en la F igura 3.4, despus de la sentenciay = &x; seejecuta.

    Volumen 5: Punteros en C Unidad 3: Punteros Avanzados 79

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • 1 0

    l!eq!gg!g5_19 rygg'amacin con C Gua del Estudiante

    s 0 B

    5 0 8 r o 2 4

    Figura 3.4: Posicin de una Variable Puntero y su Contenido

    Ahora suponga que se escribe la siguiente sentencia:z = & y ;

    Se asume que z est as ignada en memor ia en la pos ic in: :oB. Las posic iones dememoria de x, y ! z s muestran en la Figura 3.5.

    5 0 8 1024

    5 0 8 r o 2 4 3 3 0 8

    Figure 3.5: Posicin de Variables Puntero y su Contenido

    Note que i i se t iene que obtener elvalor 10 en x (en la posicin 508) se debe escr ibirP r i n t f ( * c d ' , x ) ;

    P r i n t f ( " ? d " , * Y ) ;

    Se puede tambin obtener el mismo valor tambin a travs de z.

    P r i n t f ( ' r ' , * * z l ;

    C permite que esto se extienda para tener un puntero a un puntero a un puntero a unpurrtero, y as sucesivamente sin l mite. Pero este t ipo de definicin t iene muy poco usoprctico. Para la mayora de las aplicaciones es suficiente saber cmo usar un punteroa un puntero.

    4. Arreglo de PunterosEn C, se puede terter un arreglo cuyos elementos son todos punteros. Cada uno deestos punteros, por ejemplo, puede a su vez apuntar a un arreglo unidimensional. Ladefirl icin de tal arreglo de punteros apuntando al mismo tipo de arreglo unidimensionales ' 'r,;almente la definicin de un arreglo bidimensional.

    Volurnen 5: Punteros en C Volumen 5: punteros en C B0

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

    1 0

  • Gua del Estudiante lntroduccin a la Prooramacin con C

    Un arreglo mult i-dimensional puede ser descrito como un arreglo de punteros. Tambinse puede definir como un nico puntero apuntado a un grupo de arreglos almacenadosen posiciones de memoria contiguas.

    Un arreglo bidimensional se puede definir como un arreglo unidimensional de punteroscon la siguiente definicin:

    t i p o - d e - d a t o * a r r e g l c I c _ e x p r ] ;

    En el Volumen 3, Unidad 2 - Arreglos Multi-Dimensionales, un arreglo bidimensional sedefini como sigue:

    t i p o - d e d a t o a r r e g l o I c _ e x p r l ] [ c _ e x p r 2 l ;De alguna forma, las dos definiciones anteriores son equivalentes.

    . El tamao de un arreglo es siempre una constante, representada por c_expranteriormente.

    . Los subndices de un arreglo pueden ser de t ipos integrales int ! char. El t ipode dato f f oat no se puede usar como subndice de arreglos.

    Se puede extender la definicin del uso de punteros para arreglos mult i-dimensionalescomo:

    t i po -de -da to *a r reg lo I c_exp r l J I c exp r2 ] . . . I c_exp r -11 ;Para un arreglo de n dimensiones. Note que t iene una dimensin menos. Una definicinde arreglo equivalente es como sigue:

    t i p o d e d a t o * a r r e g l o I c _ e x p r l ] [ c _ e x p r 2 l . . . I c _ e x p r l ;

    Suponga que se necesita tener un arreglo bidimensional con cinco f i las y 25 columnas,conteniendo enteros, se puede tener esto como:

    i n t * x [ 5 ] ;Aqu x [0J apunta a l comienzo de la pr imera f i la . x l r ] apunta a l comienzo de lasegunda f i la, y as sucesivamente, as como x [4] apunta al comienzo de la quinta f i la.Debe notar que el nmero de elementos en cada f i la (que define el nmero decolumnas, establecidas en este ejemplo en 25) no est definido explcitamente.Actualmente, se pueden tener las f i las para que contengan 2s elementos, ms de zselementos, o menos de zs elementos, depende de lo que se desee, pero la definicinpermanece. Esta definicin de arreglos bidimensionales es ms apropiada cuando se lecompara con la convencional.

    Se puede acceder a un arreglo b id imensional convencional como x[3] Le l . Se puedetambin acceder a un elemento como se muestra a continuacin:

    * ( x [ 3 ] + 6 )

    Volumen 5: Punteros en C Unidad 3: Punteros Avanzados 81

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    En este caso, x[3] es un puntero al pr imerelementode la f i la 3, y (x[3] + 6) apuntaal elemento e (el sptimo elemento en realidad) en la fi la:. Por lo tanto la expresin* ( x [ 3 ] + 6 ) s e r e f i e r e a x [ 3 ] t 5 l .En general, para acceder a x I i ] t j J se puede usar lo siguiente:

    * ( x l i l + j )Suponga que se desea tener un arreglo tr idimensional de enteros, por ejemplo de 5 x 10x 15. Se puede expresar ste como un arreglo bidimensional de punteros. As que setiene lo siguiente:

    i n L * y [ 5 J I l o 1 tNota: En este caso, se est tratando con 5 x 10, es decir,50 punteros, cada uno de loscuales apunta a un arreglo unidimensional de enteros. Un elemento individual de unarreglo tr idimensional, el cual convencionalmente se accede como yti l t j l Ik] , sepuede acceder como sigue:

    * ( y t i l t j l + k )Los arreglos de punteros son muy ti les para almacenar cadena de caracteres. Cadaelemento del arreglo es un puntero a carcter que define el principio de una cadenaseparada. As , s i se t iene char *a[10] ; se puede tener 10 d i ferentes cadenas.Refirindose a su correspondiente puntero se puede acceder a cada cadena individual.

    Un mtodo convencional para almacenar los 10 primeros nombres de personas es lenerlo siguiente:

    c h a r f n o m b r e [ 1 0 ] [ 3 0 ] ;Se puede tener 10 nombres. Cada uno de estos puede tener un primer nombre tanlargo como 30 caracteres (realmente 29, y un \o carcter nulo). Una mejor forma dehacer esto es tener lo siguiente:

    cha r * fnombre I lO1 tfnombre[0] apunta a l nombre de la pr imera persona, fnombret l ] a l nombre de lasegunda persona y as sucesivamente. As, no se requiere decir cuntos caracterespuede tener cada uno de estos nombres, en otras palabras no se tiene que especificarel tamao mximo de la cadena. Pero tampoco signif ica que se puede tener cualquiernmero de caracteres que se desee.

    C t iene un operador unario l lamado sizecf, el cual puede determinar el nmero debytes que un elemento de un t ipo ocupa. El operador sizeof toma el nombre del t ipocomo entrada y retorna el nmero de bytes ocupados por un elemento de ese tipo comosalida. Esto evita la necesidad de codificar dentro del programa el nmero de bytes quelos t ipos ocupan.

    Considere el siguiente ejemplo donde el operadol sizeof se usa:f n o m b r e I i ] = ( c h a r * ) m a 1 1 o c ( 3 0 * s i z e o f ( c h a r ) ) ;

    Volumen 5: Punteros en C Volumen 5: Punteros en C 82

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante lntroduccin a la Prooramacin con C

    Se puede acceder a los caracteres individuales en la cadena de caracteres comofnombre t i l t j l en la forma:

    * ( ( * f n a m e + i ) + j )

    Una clara ventaja de este mtodo de declarar y usar las cadenas de caracteres colnopunteros a caracteres es cuando se t iene un arreglo de punteros a cadenas que sonnombres, que deben ser clasif icados. En este caso, es suficiente tener el arreglo depunteros ordenados en vez de mover las cadenas mismas.

    Sea un ejemplo de manipulacin de cadenas de caracteres, para entender nrejor el usode los punteros a cadenas de caracteres.

    Ejemplo 3.1: Usar Punteros a Cadenas de CaracteresLa entrada al programa son cuatro cadenas de caracteres. Se requiere hacer los igu iente:o Comp?rar la primera cadena de caracteres con todas las otras cadenas de

    caracteres y verif icar si la primera cadena de caracteres es mayor, menor o igual alas otras cadenas de caracteres. Mostrar el resultado.

    . Concatenar las cadenas de caracteres con la palabra 'color' .

    Nota: A travs de este ejemplo se aprender el uso de la l ibrera de funciones decadenas de caracteres (s t r ing) def in idas n

  • Introdr.rccin a la Programacin con C Gua del Estudiante

    1 7 . / * A s i g n a c i n d e m e m o r i a p a r a e l s t r i n g , p d r d * /1 8 . / * A g r e g a r c o f o r y p a r a e 1 t e r m i n a ] ' \ 0 ' * /1 9 " s t r i n g s [ i ] = ( c h a r * ) m a l l o c ( ( s L r l e n ( s t r i n g ) \2 0 . + 6 + 1 ) * s i z e o f ( c h a r ) ) ;2 I " s t r c p y ( s t r i n g s [ i ] , s t r i n g ) ;

    Iz z . I

    2 3 . p r i n t f ( " \ n " ) ;2 4 . f o r ( i = 1 ; i . < T A M A N O ; i + + )2 5 . i f ( s t r c m p ( s t r i n g s [ 0 ] , s t r i n g s [ i J ) - : 0 )2 6 . p r i n t f ( " S t r i n g 1 ? s = S t : : i n g ? d ? s \ n " , \2 7 . s t r i n g s [ 0 ] , i + 1 , s t r i n g s t i l ) ;2 8 . e f s e L f ( s t r c m p ( s L r i n g s [ 0 i , s t r i n g s [ i ] ) < 0 )2 9 - p r i n t f ( " S L r i n g 1 ? s < S t r i n g ? d ? s \ n " , \3 0 . s t r i n g s [ O ] , i + 1 , s t r i n g s t i l ) ;3 1 . e l s e

    3 2 , . p r i n t f ( " S t r i n g 1 ? s > S t r i n g % d ? s \ n " , \3 3 . s t r i n g s [ 0 ] , i + 1 , s t r i n g s t i l ) ;3 4 .

    3 5 . / * C o n c a t e n a r l o s s t r i n g s d e e n t r a d a s d a d o p o r e lu s u a r i o * /

    3 6 . p r i n t f ( " \ n l o s s t r i n g s d e s p u e s d e l a \3 ' 7 . c o n c a t e n a c i o n s o n : \ n " ) ;3 8 . f o r ( i = 0 ; i < T A M A N O ; i + + ) {3 9 . s t r c a t ( s t r i n g s [ i ] , "

    " ) ;4 0 . s t r c a t ( s t r i n g s [ i ] , r r c o l o r " ) ;4 1 . p r i n t . f ( " % s \ n " , s t r i n g s t i l ) ;4 2 . )4 3 . | / * L a f u n c i n m a i n t . e r m i n a a q u * /El cdigo C termina aqu

    Se usaron las siguientes cuatro funciones de cadenas de caracteres: in t s t r len(consE char * ) : Una funCin que tOma un puntero a Una

    cadena y retorna la longitud de la cadena.. char * s t rcpy(char * , const char * : una func in que toma dos

    cadenas y copa la segunda cadena dentro de la primera cadena. in t s t rcmp(const char * , consE char * ) : Una func in que toma dos

    cadenas y retorna 0 si ambas cadenas son iguales, < o si la primera cadena esfnenor que la segunda y, > 0 si la primera cadena es mayor que la segunda.

    Volurnen 5: Punteros en C Volumen 5: Punteros en C 84

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Prooramacin con C

    char * s t rca t (char * , cons t char * ) : Una func in que toma doscadenas y concatena (une) las dos cadenas agregando la segunda cadena a laprimera.

    Note que algunas de estas funciones toma const char *. Esto implica que el punterose declara como una constante, de manera que ningn cambio se hace al parmetro enla funcin. Tome por ejemplo, la funcin strcpy donde la primera cadena essobrescrita por la segunda cadena. La primera cadena debe ser modif icada, mientras lasegunda no debe. De acuerdo a esto, se ven los parmetros en la peticin char*,c o n s t c h a r * .

    Cuando se declara un arreglo de punteros, la memoria se reserva slo para el arreglo.Cada elemento del arreglo es un puntero y por tanto debe tpicamente estar apuntandoa otras posiciones de memoria. Esta posiciones de memoria no son reservadas cuandose declara char *str ings [TAMANOJ ; .

    En el ejemplo anterior, se introdujo una caracterst ica signif icativa de C, l lamadaasignacin dinmica de memoria. Normalmente, la memoria se asigna cuando elprograma se compila. Pero la asignacin dinmica de memoria pospone la asignacinde memoria al t iempo de ejecucin. La ventaja de esta faci l idad es la posibi l idad decrear espacio para las cadenas de caracteres. En este ejemplo, se t iene espacio tantocomo se necesita. De manera que se declara una cadena simple de 100 caracteres, selee cada cadena por turno en ste, se calcula la longitud de la cadena y se asignamemoria basado en el tamao a travs de la siguiente funcin.

    vo id *ma l l -oc ( i n t t amano) ;Aqu :

    o tamano es e l espacio requer ido, e l cual se obt iene por s t r len (s t r ing) *s i z e o f ( c h a r ) .

    . s t r f en (s t r ing) re torna la longi tud y se mul t ip l ica por e l tamao del carcter ,el cual es 1 byte.

    o maf foc es la func in que as igna memor ia d inmicamente. Retorna vo id * , yse ha convert ido a char *, ya que cada elemento de str ings es un puntero acarcter. malloc se puede usarsimilarmente con todos los otros punteros en C.

    Una vez que la memoria requerida es asignada a travs de malloc, se usasimplemente la func in s t rcpy para copiar e l s t r ing ? s t r ingsI iJ . Ex is te ot rafuncin, la cual es ti l para l iberar memoria dinmicamente. Esta es void f ree (void*) ; . Est func in l ibera e l espacio de memor ia as ignado por mal toc de manera quepueda ser asignado nuevamente. Aunque no se ha aplicado esta funcin en el ejemplo,es muy ti l en el desarrol lo de aplicaciones muy grandes. Es una buena prctica l iberarmemoria que no requiera el programa.

    Finalmente, se compara la primera cadena con todas las otras cadenas y se muestra elresultado. La comparacin se hace lexicogrficamente, lo cual signif ica que la palabraape es menor que afe, ya que el segundo carcter p viene antes de f en el alfabeto.

    Volumen 5: Punteros en C Unidad 3: Punteros Avanzados 85

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Este es el mismo mtodo que se usa en los diccionarios. La salida del programa esi lasiguiente:

    I n g r e s e 4 s t r i n g s :S t r i n g 1 : g r e e nS t r i n g 2 : y e l l o wSt . r i ng 3 : b l ueS t r i n g 4 : g r e e n

    S t r i n g 1 g r e e n < S t r i n g 2 y e l l o wS t r i n g 1 g r e e n > S t r i n g 3 b l u eS t r i n g 1 g r e e n = S t r i n g 4 g r e e n

    L o s s t r i n g s d e s p u s d e I a c o n c a t e n a c i n s o n :g r e e n c o l o ry e l l o w c o l o rb l u e c o l o rg r e e n c o l o r

    Fin del Ejemplo 3.1

    5. Puntero a EstructuraSe puede tambin tener punteros apuntando a estructuras. Suponga que se t iene lasiguiente estructura:

    sLrucL persona {cha r nombre [45 ] ;i n t e d a d ;f l o a t p e s o ;

    ) ;Se puede crear una variable e inicial izarla como sigue:

    s t r u c t p e r s o n a e s t u d i a n t e = { , . J a c k , , , 1 7 , 6 5 . 5 ) ;

    Se puede tambin definir un puntero a esta estructura:s t ruc t pe rsona *spL r , .

    Esto permite tener una asignacin a sptr como se muestra a continuacin:sp t r = &es tud ian te , -

    Volumen 5: Punteros en C Volumen 5: Punteros en C 86

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Programacin con C

    Usando esta variable puntero a una estructura l lamada sprr, se puede acceder a cadacomponente individual de la estructura como se muestra a continuacin.

    spL r - >nombre

    sp t r - >edads p t r - > p e s o

    Se ha accedido a los miembros individuales de una estructura usando el operadorf lecha - ' . Se puede pasar el puntero a una estructura o una funcin como unparmetro, as que dentro de la funcin se puede acceder y usar cada uno de losmiembros de la estructura.

    6. Puntero a una FuncinUna funcin en C no es una variable. Sin embargo, se trata como tal. Es posible definirpunteros a una funcin, la cual puede ser colocada en arreglos, pasada a funciones yretornar de las funciones. El uso tpico de un puntero a una funcin radica en el hechode que una funcin misma puede ser pasada como un argumento a otra funcin. Talsituacin se presenta cuando una funcin, referida como la primera funcin, realizatareas usando otra funcin. La primera funcin necesita conocer el nombre de lasegunda funcin para usarla dentro de el la. Ahora, si la segunda funcin es diferentecada vez, cmo manipula la primera funcin esto? Una forma es tener unaconstrucci swirch case invocar la segunda funcin relevante. La forma idealpara realizar esto es recibir la funcin en s misma como un argumento, de esta forma,la primera funcin invoca la segunda funcin slo a travs de la variable recibida comoun argumento de funcin. A continuacin, se entender mejor esto a travs de unejemplo:Ejemplo 3.2: Encontrar la Raz Cuadrada de un Nmero Usando Punteros aFuncin

    Suponga que se t ienen cuatro funciones, que existen independientemente y cada unarealiza diferentes clculos dependiendo de la entrada, tal como encontrar la raizcuadrada de un entero dado de entrada, encontrar laraz cbica de un entero dado deentrada, determinar si un nmero entero dado de entrada es primo y si un entero dadode entrada es un palndrome.

    Hay adems otra funcin que crea una tabla de dos columnas, donde la primeracolumna es el nmero serial y la segunda columna t iene los valores asociados. Estosvalores se generan dependiendo del t ipo de verif icacin que necesite ser hecha; laverif icacin puede ser para laraz cuadrada, laraz cbica, etc. Esta funcin recibir lafuncin a ser l lamada como un argumento; dependiendo en cual tabla se genere.

    Volumen 5: Punteros en C Unidad 3: Punteros Avanzados 87

    O Copyright IBM Corp. 2006Los nateriales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escr i to de IBM

  • Introduccin a la Programacin con C Gua del Estudiante

    Los siguientes son los prototipos de las cuatro funciones:

    o i n L r a i z C u a d r a d a ( i n t ) ;o i n t r a i z C u b i c a ( i n t ) ;o i n t e s P r i m o ( i n t ) ;o i n L e s P a l i n d r o m e ( i n L ) ;

    El siguiente es el programa completo. Una explicacin clel uso de los punteros afuncin, basado en el programa dado a continuacin, sigue al programa:

    El cdigo C in ic ia aqu . . .1 . / * A r c h i v o s d e C a b e c e r a * /

    2 . # i n c f u d e < s t d i - o . h >

    3 . # i n c f u d e < m a L h . h >

    4 .

    5 . / * P r o t o t i p o p a r a } a f u n c i n g e n e r a r T a b l a * /6 . v o i d g e n e r a r T a b l a ( i n t ( * f p t r ) ( i n L ) ) ;7 .

    8 . / * P r o t o L i p o d e l a f u n c i n r a i z C u a d r a d a * /

    f . i n t r a i z C u a d r a d a ( i n t x ) ;1 0 .1 1 . / * L a f u n c i n p r i n c i p a l c o m i e n z a a q u * /

    ' ' \ (L . m a r - n ( t l13 . ) . Se l l ama func in gene ra rTab fa con a rgumenro

    ra i zCuadrada * /1 4 . g e n e r a r T a b l a ( r a i z C u a d r a d a ) ;1 5 . )1 6 . / * L a f u n c i n p r i n c i p a l t e r m i n a a q u * /r 7 .1 8 . / * L a f u n c i n g e n e r a r T a b l a i n i c i a a q u * /

    1 9 . v o i c l g e n e r a r T a b l a ( i n t ( * f p t r ) ( i n t ) ) {2 0 . i n t i ;

    2 I . f o r ( i = 1 ; i < = 1 0 0 0 0 ; i + + ) {2 2 . / * L l a m a n d o a r a i z C u a d r a d a * /

    2 3 . p r i n t f ( " ? d \ t ? d \ f l " , i , ( * f p t r ) ( i ) ) ;2 4 . )2 5 . )

    Volumen 5: Punteros en C Volumen 5: Punteros en C BB

    @ Copyright IBM Corp. 2006Lo: materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • Gua del Estudiante Introduccin a la Prooramacin con C

    2 6 . / *2 ' t .

    2 8 . / *2 9 . i n t

    3 0 .

    3 1 .

    3 2 .

    3 3 . \ / .

    r f i l n . i n n a n o a r T a b I a I a f u n c i n f i n a l t z a a o t t * /" , ,

    Y - r u t r u r v r r I l q L f a q Y u f /

    La func tn rat -zCuadrada in ic ia aqu * /r a i z C u a d r a d a ( i n t x ) {

    i n t s q r t = 0 ;s q r t = ( i n t ) p o w ( x , 0 . 5 ) ;r o l r r r n f c n r l - \ .

    \ v Y ! e / t

    La func in ra i zCuadrada te rm ina aqu * /

    El cdigo C f inal iza aqu

    Hay dos func iones , ma in y generarTab la . generarTab la toma un argumento quees un puntero a una funcin. Se declara un puntero a una funcin como se muestra acont inuacin:

    i n t r a i z C u a d r a d a ( i n t ) ; / * F u n c i n n o r m a l * /i n t ( * f p L r ) ( i n t ) ; / * D e c l a r a c i n d e u n p u n t e r o

    a u n a f u n c i n * /

    f n F r - f ._ L , / * As igna r f a f unc in a un punLe ro * /

    Para leer la declaracin de un puntero a una funcin correctamente, es necesario tenerun entendimiento claro de la precedencia de operadores. Los O t ienen una mayorprecedencia sobre *. As *fpLr se encierra entre O para darle una mayor precedenciasobre O. Sea la siguiente declaracin:

    i n t r a i zCuadrada ( i n t ) ;Se lee 'raizCuadrada es una funcin la cual toma un entero como argumento y retornaun entero'. El nfasis es en 'es una funcin' primero. Considere la siguiente declaracin:

    i n t * f p t r ( i n t ) ;Se lee ' fptr ' es una funcin que toma un entero como argumento y retorna un punteroa un entero'. As, para poner enfatizar primero en el 'puntero a una funcin', la variablepuntero junto con * se encierra en ( ).Como un nombre de arreglo es un puntero a un arreglo, un nombre de funcin es unpuntero a una funcin. Un nombre de funcin puede ser simplemente asignado a unavariable puntero que se declara como un puntero a una funcin (como en fpLr = f ).Pasar raizCuadrada como un argumento a generarTabla es recibido engenerarTabfa como fptr, y la funcifl raizCuadrada se invoca al diferenciar elpuntero de la funcin tal como se muestra a continuacin:

    1 * f n t - r \ l ' i \\ ! y u r / \ + /

    Volumen 5: Punteros en C Unidad 3: Punteros Avanzados 89

    O Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM

  • lntroduccin a la Proqramacin con C Gua del Estudiante

    Aqu i es el argumento entero ! *f rpr eS raizcuadrada y elvalor retornado el cual esun entero se imprime.

    Fin del Ejemplo 3.2El ejemplo 3.2 revela el poder de los punteros a funcin en C. La funcingenerarTabla puede ser invocada con cualquier argumento que es una funcin. Lafuncin que se pasa como un argumento debe satisfacer dos condiciones para que seaaceptada como un argumento para generarTabla. Las condiciones son.

    ' La funcin debe tomar un entero como un argumento. La funcin debe retornar un entero.

    Cualquier funcin que satisfaga las dos condiciones anteriores puede ser pasada comoun argumento a generarTabla.

    Volumen 5: Punteros en C Volumen 5: Punteros en C 90

    @ Copyright IBM Corp. 2006Los materiales del curso no pueden ser reproducidos total

    o parcialmente sin el permiso previo escrito de IBM