sexta-feira, 17 de abril de 2009

::: Arrays e Ponteiros :::

Ponteiros

Um ponteiro ou apontador é um tipo de dado usado em uma linguagem de programação onde o valor se refere diretamente a um endereço de memória.
Um endereço de memória, ou seja, o que em termos práticos transforma toda a memória em um grande vetor. Com isso é possível obter do sistema o valor armazenado na unidade de memória de tal endereço. O ponteiro é um tipo de dado que armazena um endereço de memória.
A figura abaixo mostra um mapa de um trecho de memória que contém duas variáveis (num, res) inteiras de tipo longo (4 bytes cada uma). Observar que os endereços estão pulando de quatro em quatro já que as variáveis são inteiras de tipo longo. Uma possível declaração destas variáveis dentro de um programa C poderia ser:

long int num=10, res=120;
Endereços Conteúdo Variável
996 --- ---
1000 10 num
1004 120 res



Mapa de Memória



Ponteiros são importantes por exemplo quando se deseja que uma função retorne mais de um valor.
Por exemplo, uma função pode receber não os valores dos parâmetros mas sim ponteiros que apontem para seus endereços. Assim esta função pode modificar diretamente os conteúdos destas variáveis.
Uma outra aplicação importante de ponteiros é apontar para áreas de memória que são administradas durante a execução do programa. Com ponteiros é possível alocar as posições de memória necessárias para armazenamento de vetores somente quando o programa estiver rodando. O programador pode reservar o número exato de posições que o programa requer.
Na maioria das arquiteturas, um ponteiro é grande o suficiente para indexar todas as unidades de memória presentes no sistema. Isso torna possível a um programa tentar acessar um endereço que corresponde a uma área inválida ou desautorizada da memória, o que é chamado de falha de segmentação. Por outro lado, alguns sistemas possuem mais unidades de memória que endereços. Nesse caso, é utilizado um esquema mais complexo para acessar diferentes regiões da memória, como o de segmentação ou paginação.
Na maioria das linguagem (C, C++, …) os ponteiros são diretamente suportados sem restrições. São utilizados para construir referências como listas encadeadas, grafos ou arvores.
Através da manipulação de ponteiros podemos lidar com arranjos, um cálculo do endereço para o elemento desejado no arranjo. Em outras estruturas de dados como as listas encadeadas, eles são usados como referencia para intercalar cada elemento da estrutura com seus vizinho.
Ponteiros também são utilizados para simular a passagem de parâmetros por referência em linguagens que não oferecem essa construção. Linguagens como C, C++ e D permitem que ponteiros possam ser utilizados para apontar para funções, os ponteiros são necessários para a alocação dinâmica de memória, sendo que temos uma melhora no desempenho, pois é muito mais rápido alocar um ponteiro para um objeto de memória já existente do que alocar o objeto inteiro novamente. Além do mais, alocando o objeto novamente não podemos alterar o original.
Em algumas linguagens e possível restringir o ponteiro para apenas um tipo de dados como por exemplo um inteiro. A linguagem tentara impedir que o programador erre durante a codificação apontando para outro tipo de dado. Outras já aceitam a conversão de dados com isso não restringem a um tipo de dados.
Para se usar o ponteiro deve se ter muito cuidado pois ele pode acessar áreas de memórias que não devem ser alteradas ou não pertencem aquela função do programa. Outro problema com os ponteiro que enquanto são manipulados como números, podem apontar para endereços não utilizados, ou para dados que estão sendo usados para outros propósitos.
Existem dois operadores especiais para ponteiros: * e &. Os dois operadores são unários, isto é requerem somente um operando. O operador & devolve o endereço de memória do seu operando. O operador * é o complemento de &. O operador * devolve o valor da variável localizada no endereço que o segue. O operador * para ponteiros não tem nada a ver com o operador multiplicação. O operador ponteiro * é unário e, como o operador &, tem precedência maior que do que todos os operadores aritméticos.
Ponteiros e Vetores estão fortemente relacionados na linguagem C. O nome de um vetor é um ponteiro que aponta para a primeira posição do vetor e todas as operações já mencionadas para ponteiros podem ser executadas com um nome de vetor.
Em uma matriz o ponteiro aponta para uma área de memória que é endereçada de maneira linear. Deste modo, é necessário mapear o endereço de cada elemento na matriz, que é dado por linha coluna, em um endereço linear.






Arrays

Arrays são dividos em dois tipos básicos, vetor e matriz. Um vetor consiste em um array de apenas uma dimensão.

exemplo de vetor: [10,20,30,...,99].

Com o exemplo anterior ao requisitar o item (3) obteriamos o valor 30.


Uma matriz, por sua vez apresenta mais de uma dimensão.

exemplo: |01, 02, 03, ...,09|
|10, 20, 30, ..., 99|

Para acessar um determinado item desta matriz é necessário informar dois argumentos. Com exemplo anterior, ao requisitarmos o item (2)(1) obteriamos o valor 10.

6 comentários:

  1. achei ótimo o trabalho só esta faltando complementar um pouco de array que ficou meio vago, pois só falou de acessar array.
    não falou de criação de array, exemplos que podem ser usados utilizando arrays entre outras coisas.

    mas achei muuito bom o trabalho.

    ResponderExcluir
  2. Acho interessante a gente comentar um fato básico, mas que nos leva a pensar um pouquinho em array... Vocês já pararam para pensar em como definir a diferença entre um array e uma lista? Eu diria o seguinte:
    Ambos são estruturas muito simples de dados, mas os arrays, permitem um acesso direto aos elementos presentes neles. Você informa a posição e então vai diretamente ao ponto. Numa lista, que possui uma estrutura de dados semelhante a um array linear, vc teria que percorrer todas as posições anteriores até chegar à posição desejada. Só pra comentar; para isso poderíamos usar vários algorítimos onde até penso que faríamos o uso dos ponteiros para nos auxiliar nisso... Alguém concorda? discorda???
    Muito bom o artigo!

    ResponderExcluir
  3. Interessante Thiago... Fico te devendo alguns algorítimos em alguma linguagem só pra exemplificar... Amanhã tento postar! É bacana essa diferença mas nunca tinha pensado!
    Vou ver alguma linguagem aqui e tentar conseguir algum exemplo ou função para isso!

    ResponderExcluir
  4. Concordo com a Lenir Thiago, muito interessante.. quanto ao assunto do trabalho achei bem explicado, ficou fácil de entender, porém poderiam ter acrescentado mais coisas de array. Mas de toda maneira gostei! Parabéns!!

    ResponderExcluir
  5. Muito legal o post de vocês, explicou muito bem a definição de array e ponteiro e ainda exemplificou muito bem ambos, o que facilitou no entendimento !!!

    Vlw

    ResponderExcluir
  6. Pessoal uma sintese muito interessante a de vcs pra quem teve dificuldade em AED tá na hora de aprender um puoquinho depois é só treinar.
    Otimo!!!

    ResponderExcluir