Escolar Documentos
Profissional Documentos
Cultura Documentos
Estrutura de Dados
Ponteiros
Apontador (ponteiro)
• Analogia
16/09/2023 Ponteiros 2
Ponteiros
• Ponteiros selvagens:
• São ponteiros que não foram inicializados, eles podem provocar uma quebra
no sistema (crash)
16/09/2023 Ponteiros 3
Ponteiros
• O operador (*):
• Obtém o VALOR armazenado em um ENDEREÇO DE MEMÓRIA, e
• Também sinaliza o ponteiro na declaração de variáveis
• O operador (&)
• Obtém o ENDEREÇO DE MEMÓRIA de uma variável
16/09/2023 Ponteiros 4
Ponteiros
• Exemplo:
16/09/2023 Ponteiros 5
ponteiros
• Declaração de ponteiros:
• int *pt; // ponteiro para inteiro
• char *temp,*pt2; //ponteiros para caracteres
• É o asterisco (*) que faz o compilador saber que aquela variável não
vai guardar um valor mas sim um endereço de memória para aquele
tipo especificado
16/09/2023 Ponteiros 6
Ponteiros
int main()
{
int i, *p;
i = 10;
p = &i;
return 0;
}
16/09/2023 Ponteiros 7
Inicialização de Ponteiro
16/09/2023 Ponteiros 8
Inicialização de Ponteiro
count
pt = &count;
pt 10
16/09/2023 Ponteiros 9
Inicialização de ponteiro
• O que acontece se fizermos:
• pt = &count
• printf(“%d”, *pt) // 10
• *pt = 12;
count
Antes pt 10
count
Depois pt 12
*pt = 12 count = 12
16/09/2023 Ponteiros 10
Atribuição de ponteiro
int main(){
int num,*p;
num=55;
return 0;
}
16/09/2023 Ponteiros 11
Atribuição de ponteiro
16/09/2023 Ponteiros 12
Atribuição de ponteiro
int main(){
int num,valor;
int *p;
num=55;
p=# //obtém endereço de num
valor=*p; //recebe o valor que está no endereço de p
// Equivalente a: valor = num
return 0;
}
16/09/2023 Ponteiros 13
Atribuição de ponteiro
16/09/2023 Ponteiros 14
Aritmética de ponteiro
• p1=p2
• Dessa forma, fazemos com que p1 aponte para o mesmo lugar que p2
16/09/2023 Ponteiros 15
Aritmética de ponteiro
• p2 = &count
• P1 = &count_1
• p1=p2
count
p2 10
count_1
p1 100
16/09/2023 Ponteiros 16
Aritmética de ponteiro
• Basicamente,
• Depois que se aprende a usar os dois operadores (& e *) fica fácil
entender operações com ponteiros
16/09/2023 Ponteiros 17
Aritmética de ponteiro
• É uma das razões pela qual o compilador precisa saber o tipo de um ponteiro
16/09/2023 Ponteiros 18
Aritmética de ponteiro
16/09/2023 Ponteiros 19
Aritmética de ponteiro
• Existem apenas duas operações aritméticas que podem ser usadas com
ponteiros:
• Adição e Subtração
• Exemplos:
• Supomos que queremos incrementar um ponteiro de 15. Basta fazer:
• p = p + 15;
• p += 15;
• Para obter o conteúdo do ponteiro 15 posições adiante:
• *(p+15);
16/09/2023 Ponteiros 20
Aritmética de ponteiro
16/09/2023 Ponteiros 21
Comparação entre dois ponteiros
• No caso de operações do tipo >, <, >= e <= estamos comparando qual
ponteiro aponta para uma posição mais alta na memória
• p1>p2
16/09/2023 Ponteiros 22
Inicialização de arrays
int vetor[10];
int *ponteiro, i;
ponteiro = &i;
16/09/2023 Ponteiros 25
observações
16/09/2023 Ponteiros 26
observações
16/09/2023 Ponteiros 27
observações
16/09/2023 Ponteiros 28
observações
p[2] *(p+2)
16/09/2023 Ponteiros 29
observações
16/09/2023 Ponteiros 30
exemplos DE FIXAÇÃO
Programa 1
p_1 = &i;
1000
16/09/2023 Ponteiros 33
Verificação em Linguagem C:
//Imprimindo o end na base hexadecimal
printf("valor &i = %p, valor de p_1 = %p\n", &i, p_1);
//Imprimindo o end na base decimal
printf("valor &i = %d, valor de p_1 = %d\n ", &i, p_1);
16/09/2023 Ponteiros 34
Tabela 1
p_2 = &j;
1000 1007
16/09/2023 Ponteiros 35
Verificação em Linguagem C:
//Imprimindo o end na base hexadecimal
printf("valor &j = %p, valor de p_2 = %p\n", &j, p_2);
//Imprimindo o end na base decimal
printf("valor &j = %d, valor de p_2 = %d\n ", &j, p_2);
16/09/2023 Ponteiros 36
Tabela 1
p_2 = &j;
p_p_1 = &p_2;
Obs.: **p_p_1 é um ponteiro de ponteiro
16/09/2023 Ponteiros 37
Verificação em Linguagem C:
//Imprimindo o end na base hexadecimal
printf(" valor &p_2 = %p, valor de p_p_1 = %p\n", &p_2, p_p_1);
//Imprimindo o end na base decimal
printf(" valor &p_2 = %d, valor de p_p_1 = %d\n\n", &p_2, p_p_1);
16/09/2023 Ponteiros 38
Tabela 1
p_p_2 = &p_1;
Obs.: **p_p_2 é um ponteiro de ponteiro
16/09/2023 Ponteiros 39
Verificação em Linguagem C:
//Imprimindo o end na base hexadecimal
printf(" valor &p_1 = %p, valor de p_p_2 = %p\n", &p_1, p_p_2);
//Imprimindo o end na base decimal
printf(" valor &p_1 = %d, valor de p_p_2 = %d\n\n", &p_1, p_p_2);
16/09/2023 Ponteiros 40
Tabela 2
j = 5;
p_2 = &j;
4 5
p_2 j
16/09/2023 Ponteiros 42
Tabela 2
4 5 1000 1053 5
p_p_1 = 1053
*p_p_1 = 1007
**p_p_1 = 5
16/09/2023 Ponteiros 43
Verificação em Linguagem C:
//Imprimindo o valor o valor de **p_p_1
16/09/2023 Ponteiros 44
Tabela 2
p_p_2 = 1030
*p_p_2 = 1000
**p_p_2 = 4
16/09/2023 Ponteiros 45
Verificação em Linguagem C:
printf("\n Imprimindo o endereco na base hexadecimal \n");
printf("valor p_1 = %p, valor de *p_p_2 = %p\n", p_1, *p_p_2);
printf("\n Imprimindo o endereco na base decimal \n");
printf("valor p_1 = %d, valor de *p_p_2 = %d\n\n", p_1, *p_p_2);
16/09/2023 Ponteiros 46
Tabela 2
p_1 int i
p_1 = 1000
*p_1 = 4
&*p_1 = 1000
16/09/2023 Ponteiros 47
Verificação em Linguagem C:
printf("\n Imprimindo o endereco na base hexadecimal \n");
printf("valor &i = %p, valor de &*p_1 = %p\n\n", &i, &*p_1);
16/09/2023 Ponteiros 48
Tabela 2
p_1 int i
p_1 = 1000
*p_1 = 4
16/09/2023 Ponteiros 49
Tabela 2
p_1 int i
&p_1 = 1030
*&p_1 = 1000
16/09/2023 Ponteiros 50
Verificação em Linguagem C:
printf("\n Imprimindo o endereco na base hexadecimal \n");
printf("valor p_1 = %p, valor de *&p_1 = %p\n", p_1, *&p_1);
16/09/2023 Ponteiros 51
Ponteiros para Ponteiros (ponteiro de
ponteiro)
• Ponteiro simples
• Ponteiro de ponteiro
16/09/2023 Ponteiros 52
Ponteiros para Ponteiros (ponteiro de
ponteiro)
Uma variável que é um ponteiro para um ponteiro deve ser declarada
como tal.
Isso é feito colocando-se um asterisco adicional na frente do seu
nome.
Por exemplo, esta declaração diz ao compilador que novo balanço é
um ponteiro para um ponteiro do tipo float:
float **novoBalanço;
16/09/2023 Ponteiros 53
Ponteiros para Ponteiros (ponteiro de ponteiro)
É importante entender que novo balanço não é um ponteiro para um número de
ponto flutuante, mas, antes, um ponteiro para um ponteiro float.
#include<stdio.h>
main(){
int x,*p,**q;
x=10;
p=&x;
q=&p;
printf("%d",**q); /*imprime o valor de x*/
}
Aqui, p é declarado como um ponteiro para um inteiro e q como um ponteiro para
um ponteiro para um inteiro. A chamada a printf() imprimirá o número 10 na tela.
16/09/2023 Ponteiros 54
Ponteiros para Ponteiros (ponteiro de ponteiro)
#include <stdio.h>
int main()
{
int x,*p,**q;
x=10;
p=&x;
q=&p;
printf("\nValor de x = %d", x); // imprime o valor de x
printf("\nValor de p = %p", p);
printf("\nValor de q = %p", q);
printf("\nConteudo apontado por q [*q] = %p", *q);
printf("\nConteudo apontado por q e por p [**q] = %d", **q);
printf("\n**q = %d",**q); // imprime o valor de x
return 0;
}
16/09/2023 Ponteiros 55
referências
16/09/2023 Ponteiros 56