Está en la página 1de 6
5,11 Apuntadores a funciones Un apuntador a una funcién contiene la direccién que tiene ta funcién en la memoria. En el capitulo 4 simos que un nombre de un arreglo es, en realidad, la direccién inicial en memoria del primer elemento del mismo, Del mismo modo, un nombre de funcién en realidad es la direccién inicial en memoria del codigo que lleva a cabo la tarea de la funcién, Los apuntadores a funciones pueden ser pasados a las funciones, devueltos de ellas, almacenados en arreglos y asignados a otros apuntadores a funciones. Para ilustrar el uso de los apuntadores a funciones, hemos modificado el programa de ordenamien- to de burbuja de la figura 5.15, formando el programa de la figura 5.26. El nuevo programa consiste en nain yen las funciones bubble, swap, ascending y descending. La funcién bubbleSort recibe como argumento un apuntador a una funcién —sea ascending o descending— ademas de un areglo de enteros y su tamaio. El programa le pide al usuario que seleccione si el arreglo debe ordenarse de manera ascendente o descendente. Si el usuario indica 1, a bubble se le pasa un apun- tador a la funcién ascending, lo que causa que el arreglo se ordena de menor a mayor. Si el usuario indica 2, a bubble se le pasa un apuntador a la funcién descending (descendente), lo ry 7 418 APUNTADORES ¥ © Coy ordene de mayor a menor. En la figura 5.27 se mue “ ig 4, aque causa que el arreglo s€ foo TE won miipion au iat ae J) programa de ordenamiento finclude include <{omanip.h> Nee void bubble( int [], const int, int (*)( int, int ) {nt ascending( int, int ); ui int descending( int, int 1 2 3 4 5 6 7 8 9 10 dnt main() We 12 const int arraySize = 107 13 int order, 14 counter, i couceryeize ] = (ty 6, by By 20, 12, 89, 68, 45, 37, ordenar en forma ascendente, \n" cout << “Teclee 1 para en forma descendente: *, 7 18 > order: ping ere * Taapatos en el orden original\n"; 1 21 gor ( counter = 0) counter < arraysizes counters ) 23 cout ee setw( 4) << af counter 17 24 35 oat ( order == 1) ( % fuppie( a, arraysize, ascending )? 2 coerce “\nbatos en orden ascendente\n" 28 > 29 else 30 Gubble( a, arraySize, descending ); 31 puppie( "\npatos en orden descendente\s"! 32 ) 33 33 gor ( counter + 07 counter < arzaysine/ counter++ ) 35 cout ice woken hdr $SaBly SOURCE ol? 36 37 cout << endly 33s return 07 9) 40 ‘A void bubble( int work(], const int size, 42 int (compare) ( int, int )) 3 44 void swap( int *, dnt * 17 45 a for ( pass = 1) pass < sizes Dé ) Figura $26 Programa Ge ordenamiento de usos moltiples que ultlza ‘apuntadores a funciones (parte 1 de 2) — canireLo 5 M9 APUNTADORES Y CADENAS | Ser (Ant count. = 0) count’ < atu — 1) courts) 4f ( (compare) (work count 1, work{ count +1) ) swap( Gwork{ count }, swork{ count + 1} 1 ) void swap( int *elementiptr, int ‘ jelement2Ptr ) int temp; temp = ‘elementirtr; ‘elenentirtr = *elenent2Ptr; ‘element 2Ptr = temp; , int ascending( int a, int b) return b int descending( int int b) return b> a; // intercambia ef b es mayor que a > 5.26 Programa de ordenamiento de usos miltiples que utllza apuntadores @ funciones (parte 2 de 2). 5.27 Salidas del programa de ordenamiento de burbuja de la figura 6.26. eNAs Carnagy Aruntapones ¥ CAD! 30 siguiente pardmeto aparece ev encabezado de la funcién de bubble tne ( rcompare )( ints nt) sto le dice a bubble que espere Un pardmetro que es un apuntador a una funcién que E devuelve un resultado entero. Se necesitan paréntesis alrededor dew. doy ex parimetros enteros ¥ pepido a que * tiene menor precedencis Vie el paréntesis que encierra los pardmetros de a fgnee*®® ver pabieranincluido Tos paréntesisy 12 ‘declaracién habria sido funcin 9 (ine, int) int ‘compare! que declara una funcién que recibe dos enteros como pardmetros y le devuelve un apuntado, ty entero. ddiente del prototipo de funcién de bubble es El pardmetro correspon ant ( * )( dint, int d se han incluido los tipos, pero, con fines de documentacién. el programa Puede ue ignorard el compilador. bubbte es llamada en una instruccién ££ como sigue Observe que s6lo incluir nombres q1 ‘La funcién que se le pasa a de ( ( *compare )( work! work[ count +11) ) { count 1, “Asi como se desreferencia un apuntador a una variable para acceder al valor de ésta, se dsref fos apuntadores a funciones para ejecutar dichas funciones. La llamada a la funcién podria haberse hecho sin desreferenciar el apuntador, como en ke ( *compare( work[ count 1, bre de funcién, Preferimos el primer método, done tador, pues explicitamente ilustra que Compare es up amar a la funcién. El segundo método para llamar apuntador dala apariencia de que compare de hecho es una funn, En vrario del programa que quisiera ver la definiciGn de Ia funcién compare del archivo. work{ count +11) ) intador directamente como no! es a través de un apurt ‘que se desreferencia para I ue utiliza el apu Ja llamada a una funcién apuntador a una funcién ala funcin a través de un puede confundir a algtin ust J descubriera que no se definié en ninguna parte Tin de los usos de los apuntadores a funciones es en los sistemas operados por mens. Al usuario se le slicita desde un mens que dé una opcién (por ejemplo, de I 5). Cada opcisn es atendida pr we pocindistinta. En un arteglo de apuntadores a funciones se almacenan Jos apuntadores a tods mn aneignes, Se toma la selecciGn del usuario como subyindice del arreglo y se emplea el apuntador de! mismo para llamar a la funci6n. El programa de la figura 5.28 presenta un ejemplo general dela mecénica de declaracién y empleo de un emenlo de apuntadores a funciones. Se definen tres funciones (function? function? j ccveton3) que toman un argumento entero y no devuelven nada. Los apuntadores 2 esas tres fin ciones se almacenan en el arreglo £, que se declara como sigue: void ( *€( 3] )( dnt ) = ( functionl, function2, Ua cers eee comenzando por el par de paréntesis de la izquierda, “£ es un areglo sp oe fancies gue oe Ant como argumento y devuelven void”. El arreglo sei clin con ls sombees dea funcions (qu, abevameate, «om ‘apuntadores). Cuando el usuario ini se {oma como subindice del arreglo de apuntadores a funciones. La Mamada de la funcion se hace como sigue: function} }7 ya \ — VOADENAS = 321 1 chotce 1)( cholce }; ff selecciona choice 1 selecciona el apuntador a oF qu uadr se desefeTencia Para que ame 4 08% Cuenta ent Fada fanci iMprime el valor dey gn OP. Chany ald choc del aca En 108 eericios desarolarg yn gee ™® Y 0 mine ah Om argumen a oper + indi rac .. 1 por meng nt? 40° 8 llamé 9" srracion de un | 2mGe 5 Waeifunctiont( int) 1 oF fonetion2( int) s 108 fonetions( Ant 17 4 8 jor sain) ( ga (ett 3 CARE) = ( functions, Yor choices function2, functions }; 2 ¢ *Introduzca un niin out < ero entre 3 Gq o> choices OY 2. 3 para termina: -) it 4 5 ytte ( choice >= 0 && choice <3) ; 2 (att choice 1)( choice ); 7 gout << “Introduzca un ninero entr: ¥ gin >> choice: te Oy 2, 3 pare cerminar: ) i p 4 got ce *BJocustén G61 programe finalieaga,” cc ons 2 petura 07 end; a} 5 5 ss emottoat( int ©) at oO cout << *Tntroduso " << a 5 <2" por ello se Llané a functiont\n\ar £) {2 vold function2( int b ) a4 | cout

También podría gustarte