Pplware

Vamos Programar? – Introdução à Programação #18

Declaração e inicialização de Apontadores

O mundo está constantemente a evoluir: desde o mais pequeno inseto à espécie Humana. Dentro das palavras que mais ouvimos atualmente, incluímos “evolução”, “mudança”, “futuro”.

A tecnologia tem revolucionado o mundo das mais diversas formas: do mais simples aparelho para medir o tempo ao mais complexo acelerador de partículas. Se quer entrar no mundo da tecnologia e deixar a sua marca, pode começar aqui.

Nesta semana, infelizmente, não haverá vídeo porém tentaremos fazer na próxima semana. Hoje iremos continuar o tema dos apontadores. Os apontadores, como já foi referido anteriormente, são um tipo de variáveis que armazenam endereços.

Declaração de apontadores

A declaração deste tipo de variáveis é bastante simples: para declarar um apontador basta colocar um * (asterisco) antes do nome da variável.

Sintaxe

Veja então a sintaxe da declaração de ponteiros.

tipo *nome;

Tal como nas restantes variáveis, temos que colocar o tipo de dados na declaração da variável devido ao facto do espaço ocupado por cada tipo de dados ser diferente.

Quando não é dado um valor a um apontador, geralmente este assume o valor da constante NULL, ou seja, não aponta para endereço nenhum.

A constante NULL está contida na biblioteca stdlib, ou seja, standard library e o seu valor é, na maioria das vezes, 0.

Inicialização de apontadores

Para inicializar um apontador, devemos igualar o seu valor ao endereço de uma outra variável do mesmo tipo.

Exemplo 1

Para exemplificarmos a relação entre uma variável comum e um ponteiro, iremos declarar o seguinte código:

#include 
#include 

int main()
{
    int numero = 5;
    int *ponteiro =  №

    printf("%d e %d", numero, *ponteiro);

    return 0;
}

Dentro da função principal, declaramos duas variáveis: a primeira, chamada numero, é uma variável do tipo de números inteiros e conta com o número 5.

De seguida, declaramos um ponteiro cujo nome é, exatamente, ponteiro e este ponteiro aponta para o endereço da variável numero. Podemos então dizer que “ponteiro aponta para numero” ou “ponteiro é o endereço de numero”.

Depois imprimimos o valor de numero e do endereço que para o qual aponta ponteiro. Isto irá imprimir “5 e 5”, pois é o mesmo dizer numero e *ponteiro visto que o ponteiro ponteiro aponta para a variável numero.

Exemplo 2

O segundo exemplo é minimamente bizarro: efetuar a soma de duas variáveis utilizando apenas apontadores que apontem para estas mesmas variáveis. Ora veja:

Se está a ter problemas com a codificação dos caracteres no Windows, inclua a biblioteca “Windows” e altere a página de codificação da linha de comandos como está na linha 7.

#include 
#include 
#include 

int main()
{
    SetConsoleOutputCP(65001);

    int a, b, c;
    int *p, *q;

    a = 5;
    b = 4;

    p = &a;
    q = &b;
    c = *p + *q;

    printf("A soma de %d e %d é %d.", a, b, c);
    return 0;
}

No exemplo anterior pode visualizar que são declaradas cinco variáveis: a a, b e c que são do tipo número inteiro e, de seguida, dois apontadores, p e q. Posteriormente é atribuído o valor 5 à variável a e o valor 4 à variável b.

Agora, para efetuar a soma utilizando os operadores, igualamos o apontador p ao endereço da variável a e o apontador q ao endereço da b. Finalmente, a soma (que estará contida na variável c) é igual à soma do conteúdo dos endereços que para os quais os apontadores p e q estão a apontar.

Exemplo 3

O exemplo anterior aparenta ser inútil, pois poderíamos fazer o mesmo com menos linhas de código. Mas, e se precisar de, por algum motivo, criar uma função que troque o valor de duas variáveis? Poderíamos, inicialmente, pensar no seguinte:

int trocaDeValores( int x, int y)
{
    /* Esta função está errada */
    int temp;

    temp = x;
    x = y;
    y = temp;

    return 0;
}

Mas a função apresentada não vai realmente alterar os valores das variáveis, pois apenas recebe os seus valores e “coloca-os” numas míseras variáveis locais. A função correta teria que ser a seguinte:

int trocaDeValores( int *p, int *q)
{
    int temp;

    temp = *p;
    *p = *q;
    *q = temp;

    return 0;
}

Com esta função sim, poderíamos trocar os valores de duas variáveis, pois ao termos acesso aos seus endereços podemos facilmente efetuar as mudanças.

Exercícios

1 – Analise o seguinte trecho de código e descubra o porquê deste estar errado.

int trocaDeValores( int *i, int *j) {
    int *temp;

    *temp = *i;
    *i = *j;
    *j = *temp;

    return 0;
}

2 – Crie uma função que receba três variáveis do tipo inteiro: minutosTotais e dois apontadores (um para a variável horas e outro para a variável dos minutos).

Dentro dessa função, os minutosTotais devem ser convertidos em horas e minutos e guardados nas respetivas variáveis cujos endereços foram passados para dentro da função.

Na função main, crie as variáveis que achar necessárias e peça o número de minutos que deseja converter em horas e minutos ao utilizador. De seguida utilize a função anteriormente criada e imprima o resultado dado por esta.

Não se esqueça que a função horasParaMinutos não deve retornar o número de horas e minutos, mas sim colocar esses valores nos endereços passados para a função.


Esta semana não iremos recomendar exercícios pois o conteúdo de hoje não é suficiente para novos exercícios. Porém, continue a praticar! Na próxima semana iremos continuar o tema dos apontadores.

Mais uma vez, gostávamos de saber a sua opinião. Caso tenha alguma dúvida, pode sempre utilizar os comentários para colocar a questão. Caso o faça,  pedimos que utilize a keyword [DUVIDA] no início do seu comentários.

Resoluções de exercícios.

Esta saga

Henrique Dias

Mais episódios:  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13][12] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23][24]

Exit mobile version