PONTEIROS
Ponteiros
Para entender ponteiro é preciso saber...
Variáveis possuem nomes que a identificam
durante a execução do programa;
Variáveis possuem um determinado valor;
Quando uma variável é declarada, o compilador
reserva uma região de memória para ela.
Essas variáveis apontam para algum lugar da
memória.
Conteúdo
1. Funcionamento
2. Declaração
3. Utilizando Ponteiros
4. Exercícios
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 2
1. FUNCIONAMENTO
• Como Funcionam os Ponteiros:
– Os ints guardam inteiros.
– Os floats guardam números de ponto flutuante.
– Os chars guardam caracteres.
– Ponteiros guardam endereços de memória.
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 3
1. FUNCIONAMENTO
• Como Funcionam os Ponteiros:
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 4
1. FUNCIONAMENTO
• Como Funcionam os Ponteiros:
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 6
2. DECLARAÇÃO
• Para declarar um ponteiro:
tipo_do_ponteiro *nome_da_variável;
• É o asterisco (*) que faz o compilador saber que
aquela variável não vai guardar um valor mas sim
um endereço para aquele tipo especificado.
Exemplos:
int *pt;
char *temp,*pt2;
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 5
2. DECLARAÇÃO
• Exemplos:
int *pt;
char *temp,*pt2;
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 8
2. DECLARAÇÃO
B1h
char c ;
‘A’ B2h
c = 'A';
B3h
B4h
B2h
char * b = &c; B5h
B6h
B7h
2. DECLARAÇÃO
• Observação:
– O tipo da variável do ponteiro deve ser de mesmo
tipo da variável que ele está referenciando:
int i = 10 ; int i = 10 ;
char * c; int * c;
c = &i; c = &i;
2. DECLARAÇÃO
• O ponteiro DEVE ser inicializado (apontado para
algum lugar conhecido) antes de ser usado!
• Para atribuir um valor a um ponteiro recémcriado
poderíamos igualálo a um valor de memória.
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 6
2. DECLARAÇÃO
Podemos então deixar que o compilador faça este
trabalho. Para saber o endereço de uma variável
basta usar o operador &:
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 7
2. DECLARAÇÃO
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 12
Exemplo de ponteiro
Exemplo 1
#include <stdio.h>
void main ()
{ int num,valor;
int *p;
num=55;
p = # /* Pega o endereco de num */
valor = *p; /* Valor eh igualado a num */
printf ("\n\n%d\n",valor);
printf ("Endereco para onde o ponteiro aponta:
%p\n",p);
printf ("Valor da variavel apontada:
%d\n",*p);
getch(); }
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 8
Exemplo 2
#include <stdio.h>
void main ()
{
int num,*p;
num = 55;
p = # /* Pega o endereco de num */
printf ("\nValor inicial: %d\n",num);
*p = 100; /* Muda o valor de num*/
printf ("\nValor final: %d\n",num);
getch();
}
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 9
3. UTILIZANDO PONTEIROS
• Se temos dois ponteiros p1 e p2 podemos igualá
los fazendo p1=p2. Isso faz com que p1 aponte
para o mesmo lugar que p2.
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 10
3. UTILIZANDO PONTEIROS
• Incrementar um ponteiro char* > anda 1 byte na
memória
• Incrementar um ponteiro double* > anda 8 bytes na
memória.
p++;
• Para incrementar o conteúdo da variável apontada
pelo ponteiro p, fazse:
(*p)++;
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 18
Ponteiros
Memória
char c; (1 byte)
int i; (2 bytes)
float f ; (4 bytes)
3. UTILIZANDO PONTEIROS
• Para incrementar um ponteiro de 15: p=p+15; ou
p+=15;
• Para usar o conteúdo do ponteiro 15 posições
adiante: *(p+15);
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 11
3. UTILIZANDO PONTEIROS
• No caso de operações do tipo >, <, >= e <=
estamos comparando qual ponteiro aponta para
uma posição mais alta na memória. Então uma
comparação entre ponteiros pode nos dizer qual
dos dois está "mais adiante" na memória.
Exemplo: p1>p2
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 20
Exemplo 3
int main(){
int y, *p, x;
y = 0;
p = &y;
x = *p;
x = 4;
(*p)++;
x--;
(*p) += x;
printf ("y = %d\n", y);
getch();
}
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 12
Exemplo 4
#include <stdio.h>
int main () {
int i, *p, num[10];
clrscr();
for (i=0;i<10; i++)
num[i] = i;
p=num;
for (i=0; i<5; i++) {
*p = *p+10;
p++;
}
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 13
Exemplo 4
for (i=0; i<10; i++)
printf("vetor (%d): %d\n",i, num[i]);
getch();
}
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 14
Ponteiro de ponteiro
B1h
char a ;
a = ‘A‘; ‘A’ B2h
B3h
B4h
char * b; B2h B5h
b = &a;
B6h
char ** c; B5h
B7h
c = &b;
3. Exercício
1. Explique a diferença entre
p++; (*p)++; *(p++);
2. O que quer dizer *(p+10);?
3. Explique o que você entendeu da comparação entre
ponteiros.
4. Qual o valor de y no final do programa a seguir?
Tente primeiro descobrir e depois verifique no
computador o resultado. A seguir, escreva um /*
comentário */ em cada comando de atribuição
explicando o que ele faz e o valor da variável à
esquerda do '=' após sua execução.
2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 15
3. Exercício
int main(){
int y, *p, x;
y = 0;
p = &y;
x = *p;
x = 4;
(*p)++;
x--;
(*p) += x;
printf ("y = %d\n", y);
getch();
} 2007, Juliana Dantas. Fonte: Apostila Linguagem C UFMG 25