D. P. I. I.

PUNTEROS A FUNCIONES EN C (Lenguaje C)

Fecha de publicación: 08/03/2018
Autor: Antonio Espín Herranz

263 visitas


En este artículo técnico vamos a ver una utilidad de los punteros a función para ordenar un array de forma ascendente o descendente. Un puntero a una función indica la dirección de memoria donde se encuentra la función. Al igual que ocurre con los arrays que el nombre del array representa un puntero lo mismo ocurre con las funciones. La idea es implementar una función que reciba el array de enteros a ordenar y que por parámetro podamos indicar si lo queremos ascendente o descendente. Tendremos dos funciones para indicar el criterio, estas dos funciones devolverán 1 si hay que intercambiar los dos elementos del array. Cómo método de ordenación utilizaremos el método de la burbuja.

int asc(int a,int b){
	return a > b;
}

int desc(int a,int b){
	return a < b;
}

Otro ejemplo, dentro de este mismo contexto podría ser tener una función que recibiera el array a ordenar y un puntero a una función que representara el método de ordenación que quisiéramos emplear: Burbuja, Inserción directa o QuickSort. En nuestro ejemplo utilizaremos el criterio de ordenación ascendente o descendente.
La función ordenar se implementaría de la siguiente manera:

void ordenar(int *numeros, int n, int (*criterio)(int,int) ){
	int i, j, aux;
	
	for (i = 0 ; i < n-1 ; i++)
		for (j = i+1 ; j < n ; j++)
			if (criterio(numeros[i], numeros[j])){
				aux = numeros[i];
				numeros[i] = numeros[j];
				numeros[j] = aux;
			}
}

La función ordenar recibe por parámetro el array que queremos ordenar (en este caso lo pasamos como un puntero, el nombre del array es un puntero). Y el puntero a función. En este caso si nos fijamos en el prototipo de las funciones ascendente y descendente tenemos: int asc(int, int) y int desc(int, int). El puntero a función tiene que reflejar el mismo prototipo y además indicando que es un puntero a función: int (*criterio)(int,int), los paréntesis son obligatorios, si pusiéramos: int *criterio(int,int): Sería una función que recibe dos enteros y devuelve un puntero a entero y además tampoco tendría sentido declararlo como parámetro de una función.

Por último, mostramos el código principal con las declaraciones y la llamada a la función y otra función que imprime el contenido del array.

void imprimir(int *numeros, int n){
	int i;
	for (i = 0 ; i < n ; i++)
		printf("%d  ", numeros[i]);
}

int main(){
	int numeros[] = {6,2,1,7,-9,0,4};
	imprimir(numeros, 7);
	ordenar(numeros, 7, asc);
	puts("\nOrdenado");
	imprimir(numeros, 7);
}

Es importante, ver la llamada a la función ordenar, para indicar la función criterio, simplemente se indica su nombre: asc o desc. No tenemos que poner paréntesis: asc() ni el nombre entre comillas. Recordar: el nombre de la función representa un puntero (la dirección de la rutina).

Adjunto el código fuente. Se ha probado con el compilador DEV-CPP.


Cursos recomendados:
C01 C02

Descarga código