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.
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] |