Vamos Programar? – Introdução à Programação #19
Apontadores: incremento, decremento e comparação: 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.
Operações com Operadores
Uma das principais vantagens da utilização de apontadores é a fácil modificação de outras variáveis e que o C trabalha de forma mais rápida quando são utilizados ponteiros.
Tal como acontece com as outras variáveis, podemos incrementar e decrementar apontadores, ou seja, incrementar ou decrementar, ou endereço (valor) que contém o apontador.
Imagine que temos um array do tipo double com dois elementos. Sabemos também que cada variável deste tipo ocupa, geralmente, 8 bytes na memória RAM. De seguida, cria um apontador cujo endereço aponta para esse array. O que vai acontecer é que esse endereço apontará para o primeiro byte do array e não para todos eles.
Hipoteticamente falando, esse apontador armazena o endereço 4550. Então, sabendo que o array ocupa 16 bytes (visto que tem capacidade para dois elementos do tipo double), podemos dizer que este array ocupa todos os bytes entre 4550 e 4565 (inclusive).
Se procedermos a uma incrementação (apontador++), este apontador deixará de apontar para o endereço 4550, apontando agora para o 4558. Porquê? Porque a próxima variável do array localiza-se nessa posição e não na posição 4551 devido ao tamanho ocupado por esse tipo de dados. O mesmo ocorre quando decrementamos um valor.
Imaginando os endereços de variáveis como números decimais (não se esqueça de que são representados em hexadecimal), as duas linhas seguintes seriam equivalentes:
Exemplo Para exemplificarmos o uso de operações e apontadores, vamos fazer uma Progressão Aritmética, onde há um termo inicial e uma razão. Cada termo é igual ao termo anterior somado com a razão.
Poderíamos fazer este pequeno programa da seguinte forma (o código abaixo está explicado):
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 |
||
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] |
Este artigo tem mais de um ano
antes de mais parabéns pelo trabalho desenvolvido ao longo dos últimos meses!
O video no youtube está privado. É possível torna-lo publico?
Obrigado
Feito 😉 Obrigado pelo reparo.
apontador++ é diferente de apontador + sizeof(double), porque ao somar 8 ao apontador está-se, na realidade, a somar 8 * 8 = 64.
Isto pode ser verificado correndo este código:
double *apontador = (double *)4550;
cout << "apontador + sizeof(double): " << (unsigned)(apontador + sizeof(double)) << endl;
apontador++;
cout << "apontador++: " << (unsigned)apontador << endl;
No texto diz “Imaginando”, nunca disse que era funcionava 100% assim 😉
Para quem quiser mais 1 fonte de estudo aconselho vivamente a assistir ao CS50 da univercidade de Harvard
CS50.harvard.edu – Lectures
Obrigado!
não sei em que linguagem está escrito o script da imagem, mas se sad() retorna um boolean, sad().stop() é capaz de dar raia eheheheh… Ou talvez não… também não conheço muitas linguagens.
É verdade e o mesmo foi referido no grupo do Faacebook Pplware @ Programacao , mas é possível para uma função se auto-redefinir. Meti aqui um exemplo de como sad pode devolver true e um método a seguir:)
http://jsfiddle.net/07sargj0/
De facto. Nem me lembrei que tal é tão facilmente conseguido com o meu querido JS. ehehe.
De facto. Nem me lembrei que tal é tão facilmente conseguido com o meu querido JS. ehehe.
[DUVIDA] Porque é usado isso? *(pointer + 1) Não entendi perfeitamente.
Olá Eduardo!
*(pointer + 1) vai apontar para a posição seguinte à que “pointer” tem armazenada naquele momento 🙂 Mais qualquer coisa, diga.
Então numa primeira passagem do loop ele estaria com pa[0] armazenado. E com *(pointer + 1) eu diria pra ele começar a fazer as somas a partir do pa[1]?
Desde já obrigado 😀
Numa progressão aritmética, o termo seguinte é igual ao termo atual somado com a razão.
Então, se o termo atual for 1, o termo 2 será igual ao valor do termo 1 + a razão.
O que se faz em (*(pointer + 1) = *pointer + razao;) é exatamente isso:
O termo seguinte [ *(pointer + 1) ] é igual ao termo atual [ *pointer ] somado com a razão [ + razao ].
E sim, quando o loop começa, ele está no pa[0]. Só que o pa[0] contém o primeiro termo e esse é a raiz para continuar. Assim, o pa[1] = pa[0] + r.
Qualquer coisa, diga 🙂
Agora sim Henrique. Obrigado pela atenção. E parabéns pelos posts.
Me parece que não é pra acessar o array, fiz testes com outros valores na soma e me retornou números “loucos”.