sexta-feira, 28 de novembro de 2008

Vetores, Matrizes, Ponteiros

Vetores

Vetores são variáveis que guardam mais de um valor. Estes valores são acessados através de índices. Estes índices sempre começam de zero. Exemplo:

int teste[4]={ 5, 4, 3, 2 };

Então a posição de índice zero do vetor teste contém o valor inteiro 5. Acessamos assim:
printf("%d\n",teste[0]);
Isto imprime na tela o número 5, que é o valor da posição zero do vetor teste.

Para alterar um valor é a simples. Exemplo:

int teste[2]={ 10, 20 };
printf("%d\n",teste[1]);
teste[1]=30;
printf("%d\n",teste[1]);

No primeiro printf o valor de teste[1] é 20, ele o imprime na tela. No segundo printf o valor de teste[1] é 30 (pois fizemos teste[1]=30), e o printf o imprime na tela.

Matrizes

Matrizes são vetores com mais de uma dimensão. Exemplo:

int teste[5][10];

Colocamos um valor (neste exemplo 20) na linha zero e coluna 5 assim:
teste[0][5]=20;

Para ler é a mesma coisa:
printf("%d\n",teste[0][5]);
Isto irá imprimir na tela o valor 20 que definimos acima.

Ponteiros

Ponteiros, como o próprio nome diz, é um tipo de variável que aponta para outra (de um tipo qualquer). Na verdade um ponteiro guarda o endereço de memória (local onde se encontra na memória) de uma variável.

Vamos iniciar um exemplo simples para entendermos melhor. Imagine que tenho a seguinte variável:

int teste=20;

Sabemos que a variável teste é do tipo inteiro (int) e armazena o valor 20.

Agora digamos que queremos uma ponteiro para a variável teste. Então criamos um ponteiro para apontar para uma variável do tipo inteira (ou seja, apontar para teste), assim:

int teste=20;
int *p;

Nota: Um ponteiro é definido usando o asterisco (*) antes do nome da variável.

Neste exemplo a variável p, por incrível que pareça, não é do tipo inteiro (int). A variável p é do tipo ponteiro, que aponta para uma variável do tipo inteiro (int).

Agora façamos p apontar para a variável teste:

int teste=20;
int *p;

p=&teste;

Nota: O símbolo & indica o endereço de memória da variável.

Fazendo p=&teste estamos dizendo que p irá armazenar o endereço de memória da variável teste. Ou seja, p não armazena o valor 20, mas sim o endereço de teste que, este sim, armazena o valor 20.

Mas então como chegar ao valor 20 usando a variável p, já que este aponta para teste?

Simples, basta fazer assim:

int teste=20;
int *p;

p=&teste;
printf("%d\n",*p);

Nota: Para acessar o valor de uma variável apontada por um ponteiro, usa-se o asterisco (*) antes da variável ponteiro.

Neste exemplo *p retorna 20, que é o valor de teste, variável o qual armazenamos seu endereço de memória em p. Logo o printf irá imprimir 20 na tela.

Outro exemplo:

char algo[5] = { 5, 4, 3, 2, 1 };
char *c;

c=&algo[2];

Neste exemplo, colocamos em c o endereço do terceiro elemento de algo. Fazendo isso, dizemos automaticamente que c[0]=3, c[1]=2 e c[2]=1.

Se tivéssemos feito c=&algo[3], então estaríamos fazendo c[0]=2 e c[1]=1.

Quando fizemos:
char algo[5];
É a mesma coisa que:
char *algo;
Porém desta última maneira o tamanho de algo ainda não tem tamanho definido. Isto se faz com a função malloc() que veremos na próximas aulas.

Nota: Nunca use um ponteiro como vetor a menos que você tenha definido seu tamanho. No Linux isto retornaria uma mensagem de segmentation fault pois estaria invadindo uma área de memória não reservada para o atual programa. Em outros sistemas operacionais isto é aceitável podendo travar o mesmo.

Nota: Para matrizes de dimensão maior que um (ou seja, não vetor) não é válido dizer, por exemplo, que char teste[2][2] eqüivale à char **teste. Isto só vale para vetores.

Outra explicação

Se você ainda não entendeu como funcionam ponteiros imagine que variáveis são casas. As casas podem armazenar um valor, dependendo de seu tipo. Além de valores normais, uma casa destas pode armazenar um endereço de outra casa. Nesta outra casa você encontraria o valor desejado.

Pode não estar claro aonde se utiliza ponteiros e o porque de usa-los. Entretanto acompanhe nossos artigos e você vai entender porque ponteiros são muito importantes e qual sua finalidade.

Nenhum comentário: