Apontadores

Nas actuais arquitecturas de microprocessadores, a memória RAM é implementada como sendo um vector de unidades de memória (tipicamente o byte ou o word). Actualmente é frequente o uso de circuítos biestáveis os quais apenas suportam dois estados estáveis, para a representação de bits. Se uma unidade de memória consistir num byte, será implementada por um conjunto de oito circuítos biestáveis. Uma representação esquemática típica é esboçada na seguinte figura.

decoder_mem

Para utilizar a memória, a entrada E tem de estar ligada. Se a entrada WR estiver ligada, significa que a memória se encontra no estado de escrita e os dados contidos no barramento D são escritos no respectivo elemento. O decoder permite controlar, por intermédio das entradas Ai, qual é o elemento de memória activo. Por exemplo, se ambas as entradas estão desligadas então é activado o elemento de memória M0 e se ambas estão ligadas então é activado o elemento M3. Supondo que ambas estão ligadas, representando-se por A=11 e WR=0 então D passa a conter o valor armazenado em M3. Ao valor dado por A, dá-se a designação de endereço de memória.
Por vezes, existem endereços para regiões de memória enexistentes, que resultam em falhas de hardware no caso de se tentar acedê-los. Outras vezes, existe mais espaço de memória do que endereços disponíveis, recorrendo-se vulgarmente a mecanismos tais como segmentação de memória e paging. Mesmo assim, cada elemento de memória tem um endereço associado.

Quando se usam instruções em C do tipo

int i;

o compilador reserva um espaço na memória suficiente para acomodar um tipo de dados inteiro. O respectivo valor é representado abstractamente por i. Claramente, esse espaço na memória tem um endereço associado e que pode ser obtido por &i. Este endereço consiste num valor que também pode armazenado, de forma abstracta, numa variável.

int *j = &i;

A instrução declara j como sendo um apontador para um tipo inteiro e atribui-se o valor do endereço onde se encontra o valor i.

Quando um programa é executado, as instruções máquina que o constituem são carregadas numa zona reservada da memória designada por segmento de código. Desta forma, também as funções possuem endereços. Pode-se declarar uma variável do tipo apontador para função com a instrução

int (*func_pointer)(int,int);

que declara finc_pointer como sendo uma variável do tipo apontador para uma função que receba dois inteiros como argumento e retorne um terceiro inteiro.

O conceito de apontador em computação é generalizado a qualquer tipo de dados com a interface de endereço de memória e tem diversas aplicações, nomeadamente ao nível da implementação de estruturas de dados, programação orientada a enventos, utilização de librarias dinâmicas, etc.

Sobre Sérgio O. Marques

Licenciado em Física/Matemática Aplicada (Astronomia) pela Faculdade de Ciências da Universidade do Porto e Mestre em Matemática Aplicada pela mesma instituição, desenvolvo trabalho no PTC (Porto Technical Centre) - Yazaki como Administrador de bases-de-dados. Dentro o meu leque de interesses encontram-se todos os temas afins às disciplinas de Matemática, Física e Astronomia. Porém, como entusiasta, interesso-me por temas relacionados com electrónica, poesia, música e fotografia.
Esta entrada foi publicada em Computadores e Internet. ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s