Professional Documents
Culture Documents
Ricardo de Almeida
(ricardo.almeida@univix.edu.br)
Agenda
1.
2.
3.
4.
5.
6.
7.
8.
9.
Relembrando...
Ponteiros
Declarao de Ponteiros
Operadores para Ponteiros
Ponteiros para Vetores
Aritmtica com Ponteiros
Ponteiros para Estruturas
Exerccios de Fixao
Reviso
Relembrando...
Quais pontos foram vistos na unidade anterior?
Tipos Estruturados
Definio de Novos Tipos
Vetores de Estruturas
Ponteiros
Ponteiros
Normalmente, toda varivel C declarada para armazenar um
valor numrico: variveis int servem para armazenar valores
inteiros, float para armazenar valores numricos com preciso
Ponteiros
Ponteiros
Existe um tipo particular de varivel em C que, ao invs de conter
valores numricos, armazena endereos de memria: So os
ponteiros
(ou
apontadores).
Um
ponteiro
uma
varivel
de
baixo
nvel
(ou
mais
especificamente
uma
Ponteiros
Declarao de Ponteiros
Declaraes de ponteiros so precedidas do smbolo * (astersco),
como no exemplo abaixo, onde declarada um ponteiro p, que
pode
conter
qualquer
endereo
de
memria
onde
est
Ponteiros
Declarao de Ponteiros
Nenhum ponteiro pode ser usado antes de ser inicializado, isto ,
enquanto no apontarem para um endereo vlido sob o risco do
programa ser abortado pelo sistema operacional por ter causado
Ponteiros
Operadores para Ponteiros
Para uso de ponteiros utiliza-se dois operadores especficos:
Ponteiros
Operadores para Ponteiros
Matriz alocada em posies contguas de memria, organizados
linha a linha.
Ponteiros
Exemplo 4.1: Declarao de Ponteiros
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int a = 24, b = 12;
int *pa, *pb;
pa = &a;
pb = &b;
/* declarando os ponteiros de a e b */
/* apontando para os endereos */
system("PAUSE");
return 0;
Ponteiros
Operadores para Ponteiros
Quando os ponteiros so declarados, eles so inicializados com um
endereo no vlido, portanto antes de us-los necessrio
atribuir um endereo e isso feito atravs do operador (&) como
Ponteiros
Exemplo 4.2: Declarao de Ponteiros
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int v = 25;
int *p;
p = &v;
/* p aponta para v */
system("PAUSE");
return 0;
Ponteiros
Exemplo 4.3: Declarao de Ponteiros
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int x = 10;
int y = 20;
int *p;
p = &x;
*p = y;
/* p aponta para x */
/* ponteiro de p aponta para y */
/* Qual os valores de x e y */
system("PAUSE");
return 0;
Ponteiros
Ponteiros para Vetores
Por regra, sempre que em um programa aparece o nome de um
vetor, sem o ndice, isto , sem os colchetes sua direita, isto
corresponde ao endereo do primeiro elemento daquele vetor.
Assim a operao, comum em programas C, de fazer um ponteiro
apontar para o primeiro elemento de um vetor pode ser
simplificada de p=&vetor[0]; para p=vetor;
Todo ponteiro que aponta para o primeiro elemento de um vetor
pode ser utilizado como uma referncia ao vetor apontado.
Ponteiros
Exemplo 4.4: Ponteiros para Vetores
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
float vet[]={3.4, 17.0, 8.2}, *p;
p = vet;
printf("%.2f\n", *p);
system("PAUSE");
return 0;
Ponteiros
Exemplo 4.5: Ponteiros para Vetores
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int i;
char txt[100], *p;
/* p = &txt[0] */
system("PAUSE");
return 0;
Ponteiros
Aritmtica com Ponteiro
possvel somar um valor inteiro um ponteiro ou subtrair um
valor inteiro de um ponteiro, mas estas operaes normalmente s
tem sentido quando apontam para elementos de um vetor.
possvel ainda calcular a diferena entre dois ponteiros. Quando
esta operao realizada entre ponteiros que apontam para
elementos de um vetor, calculada a diferena entre os ndices
apontados. Conforme exemplo abaixo:
int vet[]={30, -8, 0, 400, 5}, *p, *q, dif;
p = &vet[1];
q = &vet[3];
dif = q p;
Ponteiros
Exemplo 4.6: Aritmtica de Ponteiros
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char txt[100], *p;
system("PAUSE");
return 0;
Ponteiros
Ponteiros para Estruturas
Ponteiros que apontem para variveis de estruturas podem ser
declarados e inicializados da mesma forma que os ponteiros.
Ponteiros
Ponteiros para Estruturas
Os ponteiros para estrutura so utilizados, principalmente, na
chamada de funes. Isto por que as estruturas no podem ser
passadas por valor, apenas por referncia.
Passa-se, ento, o endereo da varivel para um ponteiro. No
permitido tambm retornar uma estrutura em uma funo mas
pode-se retornar o endereo dela.
Ponteiros
Exemplo 4.7: Ponteiros para Estruturas
#include <stdio.h>
#include <stdlib.h>
// Declara o Tipo de Estrutura Data
typedef struct data {
int dia, mes, ano;
} Data;
int main (void)
{
Data dt, *pd;
Ponteiros
/* passagem de parmetro */
pd = &dt;
system("PAUSE");
return 0;
a.
*int pti;
b.
*pti;
c.
&i;
d.
int_pti pti;
e.
int *pti;
b.
*pti igual a 10
c.
d.
e.
pti igual a 10
a.
pi = &i;
b.
*pj = &j;
c.
pj = &*&j;
d.
i = *&*&j;
e.
i = (*pi)+++*pj;
*pti igual a 10
b.
*(pti+2) igual a 2
c.
pti[4] igual a 3
d.
pti[1] igual a 10
e.
*(veti+3) igual a 6
scanf("%f", pf);
a.
Efetuamos a leitura de f
b.
No efetuamos a leitura de f
c.
d.
e.
ptj = &j;
Qual expresso no vlida?
a.
j = pti == ptj;
b.
i = pti-ptj;
c.
pti += ptj;
d.
pti++;
e.
i = pti || ptj;
a.
**matr igual a 1
b.
*(*(matr+1)+2) igual a 7
c.
*(matr[2]+3) igual a 12
d.
(*(matr+2))[2] igual a 11
e.
*((*matr)+1) igual a 51
Ponteiros
E como seria para trabalharmos com os ponteiros, na passagem
por valor e por referncia?
Reviso
Quais pontos foram vistos nesta aula?
Ponteiros
Declarao de Ponteiros
Operadores para Ponteiros
Ponteiros para Vetores
Aritmtica com Ponteiros
Ponteiros para Estruturas
ALGORITMOS II
Ricardo de Almeida
(ricardo.almeida@univix.edu.br)