Outro exemplo, usando função com argumento para função:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define w printf
#define MAX_BUF 128
#define array_num(array) (sizeof(array) / sizeof *(array))
void bubble(void *p, int width, int N,int(*fptr)(const void *, const void *));
int compara_letras(const void *m, const void *n);
int compara_numeros(const void *m, const void *n);
int main()
{
int lista[]={4,2,1,5,3,8,10,9,0,45};
char nomes[6][20] = {"Madruga","Arara","Zebra","Elefante","Babaca","Gato"};
short i;
for(i=0; i<=array_num(lista)-1; i++)
w("%d\n",lista[i]);
for(i=0; i<=array_num(nomes)-1; i++)
w("%s\n",nomes[i]);
w("--------------\nagora dando buble sort nas listas\n");
bubble(lista, 4, 10, compara_numeros);
bubble(nomes, 20, 6, compara_letras);
for(i=0; i<=9; i++)
w("%d\n",lista[i]);
for(i=0; i<=5; i++)
w("%s\n",nomes[i]);
return 0;
}
// função com argumento para função
void bubble(void *p, int width, int N, int(*fptr)(const void *, const void *))
{
int i, j, k;
unsigned char buf[MAX_BUF];
unsigned char *bp = p;
for(i = N-1; i >= 0; i--)
{
for(j = 1; j <= i; j++)
{
//repare que fptr é a função escolhida pelo usuário
k = fptr((void *)(bp + width*(j-1)), (void *)(bp + j*width));
if(k > 0)
{
memcpy(buf, bp + width*(j-1), width);
memcpy(bp + width*(j-1), bp + j*width , width);
memcpy(bp + j*width, buf, width);
}
}
}
}
//comparando letras graças "strcmp" função da lib "string.h"
int compara_letras(const void *m, const void *n)
{
char *m1 = (char *)m;
char *n1 = (char *)n;
return (strcmp(m1,n1));
}
//comparando numeros
int compara_numeros(const void *m, const void *n)
{
long *m1, *n1;
m1 = (long *)m;
n1 = (long *)n;
return (*m1 > *n1);
}
Outro exemplo arrays tridimensionais com ponteiros:
/*
* Explanação arrays tridimensionais com Ponteiros
*
*
*
* c00f3r[at]gmail[dot]com
* by Cooler_
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
/* array tridimensional
*
* [][][]
* | | |_posição do caracter, todos caracter formam 1 palavra
* | |___número da posição onde esta a palavra
* |____ número da lista de palavras a usar
*
*/
// produto por 2 de char** pois vamos fazer 2 listas de palavras
char ***lists=(char ***)malloc( 2*sizeof(char **) );
//produto por 3 em char* pq vamos usar 3 palavras
*(lists+0)=(char **)malloc(3*sizeof(char *));
// pode-se fazer tb lists[0][0]="ola"
*(*(lists+0)+0)="ola";
*(*(lists+0)+1)="Yay";
*(*(lists+0)+2)="lol";
*(lists+1)=(char **)malloc(3*sizeof(char *));
*(*(lists+1)+0)="epic";
*(*(lists+1)+1)="let";
*(*(lists+1)+2)="omg";
fprintf(stdout," %s \n %s \n %c\n",lists[0][2],lists[1][0],lists[0][0][1]);
/* mostrando uma saida qualquer
repare o terceiro elemento palavra "ola" segunda letra "l"
lists[0][0][1]='l'
|
[o][l][a] _|
0 1 2
*/
// usar free() onde usou malloc() para liberar memória HEAP
free(lists[0]);
free(lists[1]);
free(lists);
// caso use windows coloque um pause aqui no final ;-)
return 0;
}
Tem muitas dicas sobre o mesmo por aí, mas vou dar uma sugestão de leitura caso queira melhorar ainda mais em Ponteiros.
O famoso livro da truta:
Veja a versão original do meu paper: