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.735 ]

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

BSD Sockets em linguagem C

Usando o NetBSD como desktop

Bind: Explorando e evitando falhas

Trabalhando com arquivos no Perl

Buffer Overflow: Entendendo e explorando

Leitura recomendada

GNA: um Coprocessador para Aceleração Neural

Tutorial SFML

Estudando recursividade direta e indireta

openCertiface: Biométrica Facial em nuvem baseada em software livre

Compilando o Mono 2.2 no Ubuntu 8.10

  
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