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

16 Comentários

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.

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

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.


Resoluções de exercícios.

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]

Comentários

16

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de simão
    simão

    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

    1. Avatar de Henrique Dias

      Feito 😉 Obrigado pelo reparo.

  2. Avatar de Gustavo Silva
    Gustavo Silva

    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;

    1. Avatar de Henrique Dias

      No texto diz “Imaginando”, nunca disse que era funcionava 100% assim 😉

  3. Avatar de Nome
    Nome

    Para quem quiser mais 1 fonte de estudo aconselho vivamente a assistir ao CS50 da univercidade de Harvard

    CS50.harvard.edu – Lectures

  4. Avatar de Mário César
    Mário César

    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.

    1. Avatar de Fred
      Fred

      É 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/

      1. Avatar de Mário César
        Mário César

        De facto. Nem me lembrei que tal é tão facilmente conseguido com o meu querido JS. ehehe.

  5. Avatar de Mário César
    Mário César

    De facto. Nem me lembrei que tal é tão facilmente conseguido com o meu querido JS. ehehe.

  6. Avatar de Eduardo Royer
    Eduardo Royer

    [DUVIDA] Porque é usado isso? *(pointer + 1) Não entendi perfeitamente.

    1. Avatar de Henrique Dias

      Olá Eduardo!

      *(pointer + 1) vai apontar para a posição seguinte à que “pointer” tem armazenada naquele momento 🙂 Mais qualquer coisa, diga.

      1. Avatar de Eduardo Royer
        Eduardo Royer

        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 😀

        1. Avatar de Henrique Dias

          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 🙂

          1. Avatar de Eduardo Royer
            Eduardo Royer

            Agora sim Henrique. Obrigado pela atenção. E parabéns pelos posts.

      2. Avatar de Eduardo Royer
        Eduardo Royer

        Me parece que não é pra acessar o array, fiz testes com outros valores na soma e me retornou números “loucos”.