You are on page 1of 33

ALGORITMOS II

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

simples, char armazenam o cdigo ASCII de um caracter, etc.


Toda a vez que o nome de uma varivel inserido em um
programa, est se fazendo referncia ao seu valor, ou seja, o
contedo daquela varivel.

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

declarada para armazenar o endereo de memria onde est


armazenada outra varivel.
O Domnio endereos de memria um domnio bem prprio da
rea de Computao e como a linguagem C trata os endereos de
memria como cidados de primeira classe C considerada uma
linguagem

de

baixo

nvel

(ou

mais

linguagem de baixo nvel de abstrao).

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

armazenado um valor inteiro (L-se: "p um ponteiro para int").


int *p;

Os ponteiros em C so tipados, isto , devem ter um tipo


declarado e somente podem apontar para variveis do mesmo
tipo, com exceo dos ponteiros para void, que podem apontar
para variveis de qualquer tipo, mas tem utilizao limitada.

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

uma operao ilegal (acesso endereo invlido de memria).

A maneira mais simples de inicializar um ponteiro faz-lo


apontar para uma varivel existente.

Ponteiros
Operadores para Ponteiros
Para uso de ponteiros utiliza-se dois operadores especficos:

O operador &, quando colocado em frente ao nome de uma


varivel, obtm o endereo desta varivel. Ao atribuir este
endereo para um ponteiro, diz-se que o ponteiro est "apontando
para" a varivel.
O operador * somente pode ser utilizado com ponteiros. Ele
obtm o valor da varivel apontada pelo ponteiro, operao esta
que chamada de "referncia indireta".

Ponteiros
Operadores para Ponteiros
Matriz alocada em posies contguas de memria, organizados
linha a linha.

Ex.: m = matriz 4 x 3 de reais com 12 elementos.

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 */

printf("Veja endereco do ponteiro pa: %i\n", pa);


printf("Veja endereco da variavel continda no ponteiro pa: %i\n", &pa);
printf("Veja valor da variavel contida no ponteiro pa: %i\n", *pa);
printf(\nVeja endereco do ponteiro pb: %i\n", pb);
printf("Veja endereco da variavel continda no ponteiro pb: %i\n", &pb);
printf("Veja valor da variavel contida no ponteiro pb: %i\n", *pb);

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

demonstra a instruo pa=&a e pb=&b que atribui aos ponteiros


pa e pb o endereo das variveis a e b.
Uma outra novidade do programa anterior quando queremos
imprimir o endereo do prprio ponteiro isto feito referenciando
pa normalmente. Porm para imprimir o endereo contido no
ponteiro usado &pa e por ultimo para imprimir o valor do
endereo contido no ponteiro usamos *pa.

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 */

printf("%d %d\n", v, *p);


*p = 50;
printf("%d %d\n", v, *p);

system("PAUSE");
return 0;

/* atribuio por referencia indireta */

Ponteiros
Exemplo 4.3: Declarao de Ponteiros
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int x = 10;
int y = 20;
int *p;

/* declara variveis e ponteiros */

p = &x;
*p = y;

/* p aponta para x */
/* ponteiro de p aponta para y */

printf("%d %d\n", x, 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);

/* o mesmo que p = &vet[0]; */

system("PAUSE");
return 0;

Colocando-se um ndice (entre colchetes) direita do ponteiro,


obter-se- o valor correspondente na posio do vetor apontado.
Deve-se chamar a ateno que o operador * no deve ser
utilizado neste caso, apenas o colchete depois do ponteiro.

Ponteiros
Exemplo 4.5: Ponteiros para Vetores
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int i;
char txt[100], *p;

/* declara variveis e ponteiros */

printf ("Digite uma palavra: ");


scanf(" %[^\n]", txt);
p=txt;

/* p = &txt[0] */

printf("Um caracter por linha:\n");


for(i=0; p[i]!='\0'; i++)
printf("%c\n", p[i]);
/* p[i] corresponde a txt[i] */

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;

/* dif ir receber 2 (3-1) */

Ponteiros
Exemplo 4.6: Aritmtica de Ponteiros
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char txt[100], *p;

/* declara variveis e ponteiros */

printf ("Digite uma palavra: ");


scanf(" %[^\n]", txt);
printf("Um caracter por linha:\n");
for( p = txt ; *p != '\0'; p++)
printf("%c\n", *p);
/* p[i] corresponde a txt[i] */

system("PAUSE");
return 0;

Incrementar um destes ponteiros far com que ele aponte para o


prximo elemento dentro do vetor referenciado. Decrement-lo
faz com que ele aponte para o elemento anterior.

Ponteiros
Ponteiros para Estruturas
Ponteiros que apontem para variveis de estruturas podem ser
declarados e inicializados da mesma forma que os ponteiros.

A nica particularidade deste tipo de ponteiro que, para acessar


indiretamente o valor armazenado no membro de uma estrutura
atravs de um ponteiro usa-se o operador:
-> (l-se "seta") e no o * (astersco) utilizado nos ponteiros.
struct data hoje={17, 7, 2002}, *ptr;
ptr = &hoje;
printf("Ano: %d\n", ptr -> ano);

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.

struct data hoje={17, 7, 2002}, *ptr;


ptr = &hoje;
printf("Ano: %d\n", ptr -> ano);

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;

/* Declarao das variveis locais */

printf("Informe uma Data: ");


/* leitura das variveis da estrutura */
scanf("%d %d %d", &dt.dia, &dt.mes, &dt.ano);
printf("Dia: %d\n", dt.dia);
printf("Mes: %d\n", dt.mes);
printf("Ano: %d\n", dt.ano);
printf("\n");

/* apresentao das variveis da estrutura */

Ponteiros
/* passagem de parmetro */
pd = &dt;

/* apresentao das variveis do ponteiro */


printf("Dia: %d\n", pd->dia);
printf("Mes: %d\n", pd->mes);
printf("Ano: %d\n", pd->ano);
printf("\n");
/* atribuio de valores do ponteiro */
pd->dia = 30;
pd->mes = 05;
pd->ano = 2015;

/* apresentao das variveis da estrutura */


printf("Dia: %d\n", dt.dia);
printf("Mes: %d\n", dt.mes);
printf("Ano: %d\n", dt.ano);

system("PAUSE");
return 0;

Exerccios Prticos de Fixao

Exerccios Prticos de Fixao


Exerccios
1- Qual das instrues abaixo correta para declarar um ponteiro
para inteiro?

a.

*int pti;

b.

*pti;

c.

&i;

d.

int_pti pti;

e.

int *pti;

Exerccios Prticos de Fixao


2 - Seja a seguinte seqncia de instrues em um programa C:
int *pti;
int i = 10;
pti = &i;

Qual afirmativa falsa?


a.

pti armazena o endereo de i

b.

*pti igual a 10

c.

ao se executar *pti = 20; i passar a ter o valor 20

d.

ao se alterar o valor de i, *pti ser modificado

e.

pti igual a 10

Exerccios Prticos de Fixao


3 - Se i e j so variveis inteiras e pi e pj so ponteiros para
inteiro, qual atribuio ilegal?

a.

pi = &i;

b.

*pj = &j;

c.

pj = &*&j;

d.

i = *&*&j;

e.

i = (*pi)+++*pj;

Exerccios Prticos de Fixao


4 - Seja a seguinte seqncia de instrues em um programa C:
int *pti;
int veti[]={10,7,2,6,3};
pti = veti;

Qual afirmativa falsa?


a.

*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

Exerccios Prticos de Fixao


5 - Na seqncia de instrues abaixo:
float f;
float *pf;
pf = &f;

scanf("%f", pf);

a.

Efetuamos a leitura de f

b.

No efetuamos a leitura de f

c.

Temos um erro de sintaxe

d.

Deveramos estar usando &pf no scanf

e.

Nenhuma das opes anteriores

Exerccios Prticos de Fixao


6 - Seja a seguinte seqncia de instrues
int i=10, j=20;
int *pti, *ptj;
pti = &i;

ptj = &j;
Qual expresso no vlida?
a.

j = pti == ptj;

b.

i = pti-ptj;

c.

pti += ptj;

d.

pti++;

e.

i = pti || ptj;

Exerccios Prticos de Fixao


7 - Seja a declarao:
int matr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}
Qual afirmativa falsa?

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?

o que veremos no prximo captulo, quando discutirmos:


Funes.

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)

You might also like