14 - Ponteiros

Por Gilberto Roque Sonoda

Ponteiros são fundamentais em qualquer linguagem de programação.A linguagem C permite o armazenamento e a manipulação de valores de endereços na memória e isto é feito através dos ponteiros. Todo aluno de programação tem que dominar o conhecimento de ponteiros; apesar de um pouco complicado no início, com o estudo, e com muita prática, você conseguirá aprender.

14.1- Endereço de Memória

Para início de conversa vamos valar sobre os endereços de memória RAM, que é uma sequência de bytes, e cada um deles armazena um de 256 valores possíveis. Os bytes são numerados sequencialmente e o número de cada byte é o seu endereço.

Os objetos na memória ocupam uma quantidade de específica de bytes consecutivos. Abaixo um tabela com a quantidade de bytes ocupada por cada objeto:

Objeto Quantidade de bytes
Bool 1(apesar de usar apena 1 bit)
Char 1
Int 4
Long Int 8
Double 8

Cada objeto na memória ocupa um endereço, que é o endereço do primeiro byte.

Exemplo de declarações:

         char c;

         int i;

         struct {

         int x,y;

         }ponto;.

        int v\[4\];

Exemplo de alocação de espaço na memórias das variáveis declaradas:

        c            89421

        i             89422

        ponto    89426

       v\[0\]        89434

       v\[1\]        89438

       v\[2\]        89442

       v\[3\]        89446

14.2 - Operadores

14.2.1 - Operador Unário & ("endereço de"):

Quando aplicado a variável, resulta no endereço da posição de memória reservada para a mesma.

Nos exemplos dados acima teríamos que &c = 89421, &i = 89422, &v[2] = 89442, ...

Obs: Não confundir o uso do & com o operador lógico and, que se escreve && em C..

14.2.2 - Operador Unário * ("conteúdo de"):

Aplicado a variáveis do tipo ponteiro ponteiro, acessa o conteúdo dom endereço de memória armazenado pela variável ponteiro.

Para cada tipo existente há um tipo de ponteiro que pode armazenar endereços de memória , onde existem valores do tipo correspondente armazenados.

/*variável inteiro */

int a;

/*variável ponteiro para inteiro */

int *p;

14.3 - Ponteiros

A utilização de ponteiros em linguagem C é uma das características que tornam a linguagem tão flexível e poderosa. Ponteiros ou apontadores, são variáveis que armazenam o endereço de memória de outras variáveis.

Quando um ponteiro (a variável) contém um determinado endereço, dizemos que ele aponta para o endereço de memória. Assim, dizemos que um ponteiro “aponta” para uma variável quando contém o endereço da mesma. Ele pode apontar para qualquer tipo de variável.

Para animar um pouco, abaixo um link sobre ponteiros:

https://www.youtube.com/watch?v=r7f-aR7vgg0

14.3.1 - Utilização dos Ponteiros

Ponteiros são muito úteis quando uma variável tem que ser acessada em diferentes partes de um programa.

Neste caso, o código pode ter vários ponteiros espalhados por diversas partes do programa, “apontando” para a variável que contém o dado desejado.

Caso este dado seja alterado, não há problema algum, pois todas as partes do programa tem um ponteiro que aponta para o endereço onde reside o dado atualizado.

Existem várias situações onde ponteiros são úteis, por exemplo:

  • Alocação dinâmica de memória
  • Manipulação de arrays.
  • Para retornar mais de um valor em uma função.
  • Referência para listas, pilhas, árvores e grafos.

14.3.2 - Sintaxe de declaração de ponteiro

Falamos anteriormente sobre os operadores unários, e vamos relembrar agora o operador * para sintaxe da declaração dos ponteiros.

Como vimos, para definir que uma variável é um ponteiro, utilizamos o operador unário * na frente do nome da variável:

    **tipo \*nome\_ponteiro;**

Onde temos:

   **tipo**: é o tipo de dado da variável cujo endereço o ponteiro armazena.

   **\*nome\_ponteiro**: O nome da variável ponteiro.

Exemplo de declaração de ponteiro:

   **int \*ptr;**
Fonte: Dept. Informática - PUC-Rio

Fonte: Dept. Informática - PUC-Rio
Erro na atribuição *p=3, pois utiliza a memória apontada por p para armazenar o valor 3, sem que p tivesse sido iniciali-zada, logo armazena 3 em um espaço de memória desco-nhecido. Atribuição correta de *p = 3, onde p aponta para c e a atri-buição armazena 3 no espaço de memória reservado para c
Fonte: Dept. Informática - PUC-Rio

14.4 - Exercícios

Faça agora os exercícios. Acesse a lista de exercícios deste e-book clicando aqui.

Obs: Ponteiros é uma conteúdo muito extenso. Que novos alunos venha complementar este trabalho inicial!

Referências:

FEOFILOFF, Paulo; Endereços e Ponteiros. Página eletrônica do ime.usp.br. Disponível em <https://www.ime.usp.br/~pf/algoritmos/aulas/pont.html>. Acessado em 07 de novembro de 2017.

DELGADO,Armando Luiz Nicolini; Ponteiros. Página eletrônica do inf.ufpr.br. Disponível em <http://www.inf.ufpr.br/cursos/ci067/Docs/NotasAula/notas-28_Ponteiros.html>. Acessado em 07 de novembro de 2017.

CASAVELLA,Eduardo; Intellectuale. Tecnologia e Treinamento. Página eletrônica. Página eletrônica.. Disponível em <http://www.inf.ufpr.br/cursos/ci067/Docs/NotasAula/notas-28_Ponteiros.html>. Acessado em 12 de novembro de 2017.

results matching ""

    No results matching ""