Você está na página 1de 28

Linguagem C

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

• A  linguagem  C  é  altamente  dependente  dos 


ponteiros.  Para  ser  um  bom  programador  é 
fundamental que se tenha um bom domínio deles.

• 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:

– Quando  você  anota  o  endereço  de  um  colega 


você está criando um ponteiro. 
– O ponteiro é este seu pedaço de papel. Ele tem 
anotado um endereço. 
– Da  mesma  maneira,  uma  agenda,  onde  são 
guardados  endereços  de  vários  amigos, 
poderia  ser  vista  como  sendo  uma  matriz  de 
ponteiros no C.

 2007, Juliana Dantas.                          Fonte: Apostila Linguagem C ­ UFMG 4
1. FUNCIONAMENTO
 
• Como Funcionam os Ponteiros:

– Um  ponteiro  também  tem  tipo.  Um  endereço 


de um amigo é diferente do endereço de uma 
firma.  Apesar  de  o  endereço  dos  dois  locais 
ter o mesmo formato (rua, número, bairro, etc.) 
têm  significados  diferentes,  portanto ponteiros 
de tipos diferentes.

 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;

• Eles  ainda  não  foram  inicializados.  Isto  significa 


que  eles  apontam  para  um  lugar  indefinido.  Este 
lugar  pode  estar,  por  exemplo,  na  porção  da 
memória  reservada  ao  sistema  operacional  do 
computador. 

 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ém­criado 
poderíamos igualá­lo a um valor de memória. 

• Seria  muito  difícil  saber  o  endereço  de  cada 


variável  que  usamos,  mesmo  porque  estes 
endereços  são  determinados  pelo  compilador  na 
hora da compilação e realocados na execução.

 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 &:

int count = 10;


int *pt; // declara um ponteiro
pt = &count; // aloca um endereço
2. DECLARAÇÃO
• O inteiro count com o valor 10
• A expressão &count nos dá o endereço de count, o 
qual armazenamos em pt. O valor de count não é 
alterado.  Continua valendo 10.

int count = 10;


int *pt;
pt = &count;

 2007, Juliana Dantas.                          Fonte: Apostila Linguagem C ­ UFMG 7
2. DECLARAÇÃO

• Como  pt  foi  inicializado,  ele  está  agora 


"liberado"  para  ser  usado.  Podemos,  por 
exemplo, alterar o valor de count usando pt. 

• O  comando  pt=&count  faz  com  que  *pt  seja 


equivalente  ao  próprio  count.  Isto  significa  que, 
para mudar o valor de count para 12, basta fazer 
*pt=12.

 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 = &num; /* 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 = &num; /* 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. 

• Se  quisermos  que  a  variável  apontada  por  p1 


tenha  o  mesmo  conteúdo  da  variável  apontada 
por p2 devemos fazer *p1=*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, faz­se:
(*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