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: 19.034 ]

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

Usando o NetBSD como desktop

Apache + PHP + MySQL + ftpd no OpenBSD

Usando o PF - Packet Filter

Buffer Overflow: Entendendo e explorando

Bind: Explorando e evitando falhas

Leitura recomendada

Tutorial SFML

lib cURL - Trabalhe com URLs em C

O Produtor e o Consumidor

Programação de Jogos com SDL

Cuidado com números em Ponto Flutuante

  
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