sempre que me perguntam a diferenca entre ponteiro e vetor eu respondo que quem usa vetor eh indio! eh obvio, aquelas letrinhas com flexinhas em cima parecem pequenos seres sob ataque de apaches! hehehe
enfim, se vc olhar a documentacao oficial de macho da linguagem C (o K&R, claro) vc encontra *duas* miseras referencias a palavra vector, contra centenas ou talvez milhares de referencias a palavra array. eu francamente nunca achei uma boa traducao para array, mas certamente vetor nao eh! de fato, vetor eh outra coisa completamente diferente e mais adiante posso comentar algo.
voltando aos ponteiros e arrays, existe um capitulo inteiro sobre isso no K&R, onde vc descobre que eles sao notacoes complementares para a mesma coisa!
uma forma simples de entender a diferenca entre eles e como eles podem funcionar juntos eh imaginar que a memoria sram e flash de um processador sao arrays de bytes e os registros internos do processador como o stack pointer e o program counter sao ponteiros que apontam para areas dentro dos arrays de bytes. algo que poderia ser escrito em C como:
char flash[1024];
char sram[1024];
char *pc;
char *sp;
obviamente, o program counter deveria apontar para instrucoes na flash e o sp para o topo da sram, algo que poderia ser escrito como:
pc = &flash[0];
sp = &sram[1023];
onde o & eh para pegar o endereco de determinado elemento de dados na memoria... ou simplesmente podia escrever:
pc = flash;
sp = sram+1023;
que tambem funciona. pela primeira igualdade vc conclui facil: se pc = flash e pc eh um ponteiro, entao flash tambem eh um ponteiro! de fato flash e sram sao ponteiros constantes, que sempre apontam para o inicio dos respectivos arrays de bytes. entao sim, labels de arrays sao ponteiros e vc pode usar eles como tal, por exemplo:
*flash = 0;
coloca o valor zero no primeiro elemento do array, usando notacao de ponteiro, de forma identica a:
*pc = 0;
a diferenca eh que vc pode incrementar pc para ir para o proximo endereco, mas nao flash, portanto:
*pc = 0;
pc++;
*pc = 0;
coloca zero nas duas primeiras posicoes do array. os ponteiros constantes flash e sram nao permitem aquele incremento, pq na verdade eles sao virtuais! como eles sao constantes, sao resolvidos apenas em tempo de compilacao, nunca em tempo de execucao, assim:
*flash = 0;
flash++;
*flash = 0;
nao eh uma notacao valida para um ponteiro base de array. vc teria que usar ele como se usa um array, ou seja:
int i=0;
flash[i] = 0;
i++;
flash[i] = 0;
sendo o subscritor do array resolvivel em tempo de execucao. agora a coisa bacana: se um array possui um ponteiro base cuja unica limitacao eh ser constante, sera possivel criar arrays com ponteiro base nao constante ? perfeitamente:
int i=0;
pc[i]=0;
i++;
pc[i]=0;
ou
int i=0;
pc[i]=0;
pc++;
pc[i]=0;
em ambos os casos vc grava 0 nos dois primeiros bytes do array. o interessante eh que o ponteiro base do array nesse caso nao eh constante! em tempo as duas seguintes notacoes sao intercambiaveis:
pc[i] = 0
eh o mesmo que:
*(pc+i) = 0;
que eh o mesmo que:
*(i+pc) = 0;
e que resulta na seguinte expressao perfeitamente identica e valida:
i[pc]=0;
onde i eh um inteiro que chamamos de indice. enfim, ponteiros e arrays sao quase a mesma coisa, com a diferenca fundamental que arrays alocam espacos na memoria e seus ponteiros base sao constantes resolviveis apenas em tempo de compilacao. ponteiros sao variaveis que podem apontar para qq lugar em tempo de execucao e podem operar tanto como ponteiros quanto arrays.
com o tempo vc acostuma com isso e comeca a fazer doideiras tipo:
strcpy(char *d,char *s)
{
int i;
for(i=0;d[i]=s[i];i++);
return i;
}
neste caso, pegamos dois ponteiros e simplesmente usamos notacao de array em cima deles. muita gente questiona que arrays e ponteiros nao sao a mesma coisa pq o codigo gerado eh diferente. isso eh obvio se pensar que o enderecamento de arrays pode ser resolvido em parte em tempo de compilacao e otimizado, enquanto que enderecamento de ponteiros soh pode ser integralmente resolvido em tempo de execucao.
mas o exemplo ilustra bem que possuem notacao perfeitamente intercambiavel... bom, espero que o exemplo inicial seja bem claro sobre a diferenca que realmente existe... e em C eh aquele lance: se nao tem regra falando que nao pode, eh pq pode tudo!
