desde que voce entenda que a notacao acima eabsolutamente equivalente a se fazer:*(nome_da_variavel+indice)Agora podemos entender como e que funciona um vetor! Vamos ver o que podemos tirarde informacao deste fato. Fica claro, por exemplo, porque e que, no C, a indexacao comecacom zero. E porque, ao pegarmos o valor do primeiro elemento de um vetor, queremos, defato, *nome_da_variavel e entao devemos ter um indice igual a zero. Entao sabemos que:*nome_da_variavel e equivalente a nome_da_variavel[0]Outra coisa: apesar de, na maioria dos casos, nao fazer muito sentido, poderiamos terindices negativos. Estariamos pegando posicoes de memoria antes do vetor. Isto explicatambem porque o C nao verifica a validade dos indices. Ele nao sabe o tamanho do vetor. Eleapenas aloca a memoria, ajusta o ponteiro do nome do vetor para o inicio do mesmo e,quando voce usa os indices, encontra os elementos requisitados.Vamos ver agora um dos usos mais importantes dos ponteiros: a varredura sequencialde uma matriz. Quando temos que varrer todos os elementos de uma matriz de uma forma47sequencial, podemos usar um ponteiro, o qual vamos incrementando. Qual a vantagem?Considere o seguinte programa para zerar uma matriz:int main (){float matrx [50][50];int i,j;for (i=0;i<50;i++)for (j=0;j<50;j++)matrx[i][j]=0.0;return(0);}Podemos reescreve-lo usando ponteiros:int main (){float matrx [50][50];float *p;int count;p=matrx[0];for (count=0;count<2500;count++){*p=0.0;p++;}return(0);}No primeiro programa, cada vez que se faz matrx[i][j] o programa tem que calcular odeslocamento para dar ao ponteiro. Ou seja, o programa tem que calcular 2500deslocamentos. No segundo programa o unico calculo que deve ser feito e o de um incrementode ponteiro. Fazer 2500 incrementos em um ponteiro e muito mais rapido que calcular 2500deslocamentos completos.Ha uma diferenca entre o nome de um vetor e um ponteiro que deve ser frisada: umponteiro e uma variavel, mas o nome de um vetor nao e uma variavel. Isto significa, que naose consegue alterar o endereco que e apontado pelo "nome do vetor". Seja:int vetor[10];int *ponteiro, i;ponteiro = &i;/* as operacoes a seguir sao invalidas */vetor = vetor + 2; /* ERRADO: vetor nao e variavel */vetor++; /* ERRADO: vetor nao e variavel */vetor = ponteiro; /* ERRADO: vetor nao e variavel */Teste as operacoes acima no seu compilador. Ele dara uma mensagem de erro. Algunscompiladores dirao que vetor nao e um Lvalue. Lvalue, significa "Left value", um simbolo quepode ser colocado do lado esquerdo de uma expressao de atribuicao, isto e, uma variavel.48Outros compiladores dirao que tem-se "incompatible types in assignment", tipos incompativeisem uma atribuicao./* as operacoes abaixo sao validas */ponteiro = vetor; /* CERTO: ponteiro e variavel */ponteiro = vetor+2; /* CERTO: ponteiro e variavel */O que voce aprendeu nesta secao e de suma importancia. Nao siga adiante antes deentende- la bem.Ponteiros como vetoresSabemos agora que, na verdade, o nome de um vetor e um ponteiro constante. Sabemostambem que podemos indexar o nome de um vetor. Como consequencia podemos tambemindexar um ponteiro qualquer. O programa mostrado a seguir funciona perfeitamente:#include <stdio.h>int main (){int matrx [10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int *p;p=matrx;printf ("O terceiro elemento do vetor e: %d",p[2]);return(0);}Podemos ver que p[2] equivale a *(p+2).StringsSeguindo o raciocinio acima, nomes de strings, sao do tipo char*.