Programação Imperativa

Aula 18

Sumário




Representação de variáveis na memória de um computador

Quando vos ensinei o conceito de variável, expliquei-vos que uma variável era como se fosse uma caixinha que podia ter um valor lá dentro. Por exemplo

    int n;

corresponde à seguinte figura.

Quando fazemos

    n = 5;

o valor que está dentro da caixinha passa a ser 5.

Para os arrays e estruturas é a mesma coisa.

    int a[5];

corresponde a cinco caixinhas, cada qual do tipo int, indexadas pelos índices 0,1,2,3,4.

    typedef struct
    {
       float x;
       float y;
    } ponto;

    ponto p;

corresponde a uma caixa que tem 2 coisas: x e y.

É útil pensar nas variáveis com se fossem caixinhas mas na realidade estas caixinhas não existem. Aquilo que existe na memória do computador é um array muito grande onde todas as variáveis ficam guardadas. Os índices das posições de memória chamam-se endereços tal como indicado na figura que se segue (os endereços são E0, E1, E2, E3, ...).

Todas as variáveis que declaram nos programas ficam guardadas algures em posições da memória do computador. Por exemplo, imaginemos que fazíamos um programa em que definíamos duas variáveis do tipo inteiro: a e b.

    int a,b;

    a = 46;
    b = 17;

Quando o programa é executado, o computador reserva um espaço na memória para guardar as variável a e b. Por exemplo, o computador poderia guardar a variável a na posição E518 e a variável b na posição E833. Estas posições chamam-se endereços. Portanto, o endereço da variável a é E518 e o endereço da variável b é E833.

Resumindo, uma variável tem sempre 2 coisas: um valor e um endereço. No exemplo acima, o valor da variável a é 46 e o endereço da variável a é E518.

Apontadores

Na linguagem C, existem variáveis especiais que permitem manipular endereços. Essas variáveis especiais chamam-se apontadores. Do mesmo modo que as variáveis têm um tipo de dados associado, os apontadores também têm um tipo de dados associado. Vejamos um exemplo:

    int *p;

Esta definição declara uma variável chamada p. A variável p é um apontador para um inteiro. Por outras palavras, p é uma variável cujo valor é um endereço de uma variável do tipo int.

Voltemos ao nosso exemplo anterior.

    int a,b;
    int *p;

    a = 46;
    b = 17;
    p = &a;

O operador & devolve o endereço da variável que se lhe segue. No exemplo, se a variável a estiver a ser guardada no endereço E518, o conteúdo da variável p vai passar a ser E518. Resumindo, o valor de p indica a localização da variável a na memória do computador. Por isso, diz-se que p aponta para a.

Reparem que p também é uma variável e como tal também tem um endereço (por exemplo, o computador poderia guardar p no endereço E2). Ou seja, tal como as outra variáveis, p também tem 2 coisas: um endereço e um valor. O endereço de p é E2 e o valor de p é E518.

Além do operador &, existe um outro operador cujo símbolo é um asterisco (*), que pode ser aplicado a um apontador. Se p for um apontador, *p devolve o valor da variável que está na posição de memória indicada por p. Por outras palavras, *p dá o valor que é apontado por p. Exemplo:

    int a,b;
    int *p;

    a = 46;
    b = 17;
    p = &a;
    b = *p;

Quando o programa executa a instrução

    b = *p;

O computador irá colocar na variável b (posição E833 de memória) o valor que é indicado por p. Esse valor é 46, o valor que está na posição de memória E518. Em resumo, na altura em que o programa executa a instrução esta instrução, *p é sinónimo da variável a.

Aconselho-vos a estudarem esta aula e a prestarem atenção aos bonecos, pois só assim é que ficarás a entender esta matéria. Muitos de vós devem estar a pensar o seguinte: "afinal para que é que serve esta história dos apontadores?" A resposta será dada na próxima aula. Para já, acreditem apenas que existem certas coisas que só se conseguem fazer na linguagem C manipulando apontadores.


Resumo dos resumos: