isso ae vc trata como um array de ponteiros...
tipo, onde vc le char **p, vc pode ler tb char *p[], daih jah sacou neh? para todo i, fazendo p[i] vc tem um ponteiro char *... eh um tipo de acesso muito mais veloz q listas encadeadas, pq no lugar de varrer a lista para achar o i-esimo elemento, vc simplesmente faz um lookup direto para p[i].
sei lah, pega um exemplo ae, quer receber 1000 strings e ir guardando meio que dinamicamente, mas nao sabe o tamanho de cada uma:
- Código: Selecionar todos
char **p;
char buffer[1000]; // maximo de cada string
p = malloc(1000*sizeof(char *));
for(i=0;i!=1000;i++)
{
gets(buffer);
p[i] = malloc(strlen(buffer));
strcpy(p[i],buffer);
}
a vantagem eh que vc tem na verdade dois arrays de 1000 elementos, um para o buffer e outro para a lista de ponteiros... cada string recebida, porem pode ter comprimento diferente. assim no lugar de armazenar 1000x1000 bytes, na verdade vc tem 2000 bytes + 1000*n, onde n eh o comprimento medio das strings recebidas.
ou entao, pensa num ring buffer com 32 entradas:
- Código: Selecionar todos
char *p[32];
// init
for(i=0;i!=32;i++)
{
p[i]=NULL;
}
...
// procura entrada livre e coloca pacote
for(i=0;i!=32;i++) if(p[i]==NULL)
{
p[i]=frame;
}
...
// procura entrada e transmite
for(i=0;i!=32;i++)
if(p[i])
{
send(p[i]);
free(p[i]);
p[i]=NULL;
}
}
tem um outro lance sinistro que eh tries... vc usa algo como:
while(p[i]) p = p[i];
e vai varrendo uma arvore de lookups! eh algo como procurar o ponteiro do ponteiro do ponteiro ... do ponteiro.
fabim escreveu:Pessoal.
Sempre usei "void *" quando não sabia se iria utilizar const ou variavel de ram, para jogar para a função.
Só que eu estou mexendo com uma bomba, que eu encontrei.
"char **dado"
Isto mesmo, doi "*". Ou seja, ponteiro do ponteiro.
Como se comporta isso ?