Ponteiros - Saindo de Pesadelos

Aqui, vou explicar como trabalhar com ponteiros em C da forma mais fácil possível, tentarei mostrar algo avançado
também. Enfim, quer aprender a usar ponteiro? Leia este artigo, nunca mais irá apanhar.

[ Hits: 18.756 ]

Por: C00L3R_ em 02/04/2012 | Blog: https://github.com/CoolerVoid


Ponteiros para função com argumento e arrays tridimensionais



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:
Página anterior    

Páginas do artigo
   1. Introdução
   2. Ponteiros, ponteiros para função...
   3. Ponteiros para função com argumento e arrays tridimensionais
Outros artigos deste autor

Trabalhando com arquivos no Perl

Módulos de Web no Perl

BSD Sockets em linguagem C

Usando o NetBSD como desktop

Banco de dados orientados a documentos

Leitura recomendada

Linguagem C - Funções Variádicas

Tratamento de exceções na linguagem C

Mapear objetos em C

Bug afeta todas as distros

Tutorial OpenGL v3.0

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts