Buscar

Prog I - Aula 8: ponteiros

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 23 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 23 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 23 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Ponteiros
INF1005 – Programação I – 33B
Prof. Gustavo Moreira
gmoreira@inf.puc-rio.br 
1
ponteiros
tópicos
motivação
declaração
atribuiçãoatribuição
ponteiro como parâmetro para função
referência
Capítulo 4 do livro, pp.45-51
2
Uma função em C pode retornar dois ou mais 
valores?
R: Não.
Uma função em C pode acessar (ler ou 
alterar) variáveis locais de outras funções?
3
R2: Somente se a função tiver os endereçosendereçosendereçosendereços
dos valores a serem alterados.
alterar) variáveis locais de outras funções?
R1: Não diretamente...
Lembrando: scanf("%d", &num&num&num&num);
Por que usar ponteiros?
Em C, funções recebem parâmetros porporporpor valorvalorvalorvalor (cópia)
se um valor é modificado dentro da função, quando a função termina
(desempilha), os valores originais se mantêm inalterados
void somaprod(int a, int b, int soma, int prod)
{ 
soma = a+b; prod = a*b; 
}
int main(void) {
int s, p;
2
3
4
int s, p;
somaprod (3, 5, s, p);
printf("soma: %d \nproduto: %d\n", s, p);
return 0;
}
1
4
04_17_func_par_valor.c
1. após decl. main
main
p ?
s ?
2. chamada de somaprod
somaprod
prod ?
soma ?
b 5
a 3
main
p ?
s ?
3. após os cálculos
somaprod
prod 15
soma 8
b 5
a 3
main
p ?
s ?
4. na volta para a main
main
p ?
s ?
soma: 751351
produto: -267762
(lixo)
Por que usar ponteiros?
funções podem receber endereços como parâmetro
se uma função conhece o endereço de uma posição de memória, ela
pode modificar o conteúdo dessa posição
void somaprod(int a, int b, int* soma, int* prod)
{ /* muda o valor do que está no endereço respectivo */
*soma = a+b; *prod = a*b;
}
int main(void) {
int s, p;
2
3
5
int s, p;
somaprod (3, 5, &s, &p); /* passa valores 3 e 5 e endereços de s e p */
printf("soma: %d \nproduto: %d\n", s, p);
return 0;
}
1
1. após decl. main
main
p ? 108
s ? 104
2. chamada de somaprod
somaprod
prod 108 124
soma 104 120
b 5 116
a 3 112
main
p ? 108
s ? 104
3. atrib. após cálculos
somaprod
prod 108 124
soma 104 120
b 5 116
a 3 112
main
p 15 108
s 8 104
4. na volta para a main
main
p 15 108
s 8 104
4
04_19_func_par_ref.c
soma: 8 
produto: 15
5. após printf
0000
variável do tipo ponteiro
tipo que armazena um endereço de memória
/* variáveis do tipo inteiro */
int a=5, b;
/* variável do tipo ponteiro para inteiro */
int * p;
p = &a; /* atribui a p o endereço de a */ 0xA100 0xA108p
?
?
5
0xA108
0xA104
0xA100
p
b
a
p = &a; /* atribui a p o endereço de a */
b = *p; /* atribui a b o conteúdo de p */
6
0xA100
5
5
0xA108
0xA104
0xA100
p
b
a
0xA100
?
5
0xA108
0xA104
0xA100
p
b
a
1111
2222
operador unário & “endereço de”
&a
operador unário * “conteúdo de ”
*p
“conteúdo de” = valor armazenado no endereço p
*p
variável do tipo ponteiro (cont.)
int a;
int *p; /* declaração de ponteiro para inteiro */
int c;
a = 5; /* a recebe o valor 5 */
p = &a; /* p recebe o endereço de a
?
?
5a
p
c
104
108
112
?
104 
5a
p
c
104
108
112
1111
1
2
p = &a; /* p recebe o endereço de a
(p aponta para a) */
*p = 6; /* conteúdo de p (valor armazenado na 
posição de memória apontada por p) 
recebe 6 */
c = *p; /* c recebe o conteúdo de p (valor 
armazenado na posição de memória 
apontada por p) */
7
?
104 
6a
p
c
104
108
112
6
104 
6a
p
c
104
108
112
2222
3333
4444
3
4
exemplo
int main ( void )
{
int a=5;
int *p;
p = &a;
*p = 2;
3
Qual é a saída do programa?
EX. 01
8
*p = 2;
(*p)++;
printf("%d ", a);
return 0;
}
?
5a
p
5a
p
2a
p
3a
p
cuidado!
int main ( void )
{
int a;
int *p;
*p = 2;
printf("%d ", a);
p não foi inicializado; onde 2 é armazenado?
Onde há erro(s)?
a não foi inicializado; qual é o seu valor?
EX. 02
9
printf("%d ", a);
return 0;
}
a não foi inicializado; qual é o seu valor?
ponteiros
Considerando
int x;
int* pX = &x;
Se eu quiser ler o valor de x do teclado, 
EX. 03
0xA100
???
0xA104
0xA100
pX
x
&pX == 0xA104
&x == 0xA100
Se eu quiser ler o valor de x do teclado, 
como posso fazer?
scanf("%d", x);
scanf("%d", &x);
scanf("%d", pX);
scanf("%d", &pX);
10
ponteiros
Considerando
int x;
int* pX = &x;
Se eu quiser ler o valor de x do teclado, 
EX. 03
0xA100
???
0xA104
0xA100
pX
x
&pX == 0xA104
&x == 0xA100
Se eu quiser ler o valor de x do teclado, 
como posso fazer?
scanf("%d", x);
scanf("%d", &x);
scanf("%d", pX);
scanf("%d", &pX);
11
matéria antiga
ponteiros
Considerando
int x;
int* pX = &x;
Se eu quiser ler o valor de x do teclado, 
EX. 03
0xA100
???
0xA104
0xA100
pX
x
&pX == 0xA104
&x == 0xA100
Se eu quiser ler o valor de x do teclado, 
como posso fazer?
scanf("%d", x);
scanf("%d", &x);
scanf("%d", pX);
scanf("%d", &pX);
12
Por quê?
matéria antiga
declaração, endereço, conteúdo
#include <stdio.h>
void somaprod (int a, int b, int* ps, int* pp)
{
*ps = a + b; /* altera o valor apontado pelo ponteiro */
*pp = a * b;
}
parâmetros do tipo ponteiro para inteiro:
int* nome_var
acesso ao conteúdo (um valor inteiro) do ponteiro x:
*x
}
int main (void)
{ 
int x, y, s, p;
printf("Digite dois numeros:");
scanf("%d%d", &x, &y);
somaprod(x, y, &s, &p); /* endereço das variáveis */
printf("Soma: %d, produto: %d \n", s, p);
return 0; 
} 13
endereço de uma variável x: &x (ponteiro para x)
exemplo
> Como trocar os valores de duas variáveis?
#include <stdio.h>
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
_____________________________________________
EX. 04
int main (void)
{ 
int x, y;
printf("Digite dois numeros:");
scanf("%d%d", &x, &y);
printf("Os numeros digitados foram: %d e %d \n", x, y);
______________________________________________________
printf("Os numeros trocados sao: %d e %d \n", x, y);
return 0; 
}
14
exemplo
> Como trocar os valores de duas variáveis?
#include <stdio.h>
void troca (______, ______)
{
_____________________________________________
_____________________________________________
_____________________________________________
}
EX. 04
int main (void)
{ 
int x, y;
printf("Digite dois numeros:");
scanf("%d%d", &x, &y);
printf("Os numeros digitados foram: %d e %d \n", x, y);
troca(__,__);
printf("Os numeros trocados sao: %d e %d \n", x, y);
return 0; 
}
15
exemplo
> Como trocar os valores de duas variáveis?
#include <stdio.h>
void troca (______, ______)
{
_____________________________________________
_____________________________________________
_____________________________________________
}
EX. 04
int main (void)
{ 
int x, y;
printf("Digite dois numeros:");
scanf("%d%d", &x, &y);
printf("Os numeros digitados foram: %d e %d \n", x, y);
troca(&x,&y);
printf("Os numeros trocados sao: %d e %d \n", x, y);
return 0; 
}
16
exemplo
> Como trocar os valores de duas variáveis?
#include <stdio.h>
void troca (int* a, int* b)
{
__________________________________________________________________________________________
_____________________________________________
}
EX. 04
int main (void)
{ 
int x, y;
printf("Digite dois numeros:");
scanf("%d%d", &x, &y);
printf("Os numeros digitados foram: %d e %d \n", x, y);
troca(&x,&y);
printf("Os numeros trocados sao: %d e %d \n", x, y);
return 0; 
}
17
exemplo
> Como trocar os valores de duas variáveis?
#include <stdio.h>
void troca (int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
Simule a execução deste 
programa. Como fica a pilha de 
execução?
EX. 04
int main (void)
{ 
int x, y;
printf("Digite dois numeros:");
scanf("%d%d", &x, &y);
printf("Os numeros digitados foram: %d e %d \n", x, y);
troca(&x,&y);
printf("Os numeros trocados sao: %d e %d \n", x, y);
return 0; 
}
18
dúvidas?dúvidas?
19
exercício
Escreva uma função que receba um número inteiro n e dois endereços 
(ponteiros) para números reais, leia n números reais, atribua ao conteúdo 
dos ponteiros os valores mínimo e máximo dos n números e retorne sua 
média aritmética. Escreva também um programa para testar sua função.
EX. 05
__________________________________________________________________
__________________________________________________________________
20
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
__________________________________________________________________
exercício EX. 05
#include <stdio.h>
float media(int n, float* min, float* max) /* aqui, min e max são ponteiros para inteiros */
{
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
21
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
______________________________________
}
int main(void)
{
float min, max, med = media(5, &min, &max); /* aqui, min e max são inteiros */
printf("min: %f, max: %f, media: %f\n", min, max, med);
return 0;
}
exercício EX. 05
#include <stdio.h>
float media(int n, float* min, float* max) /* aqui, min e max são ponteiros para inteiros */
{
int i;
float valor, soma;
if (n <= 0) /* se n não for positivo, sai retornando zero */
{
*min = 0; *max = 0; 
return 0.0F;
}
scanf("%f", &valor); /* lê o primeiro valor */
*min = *max = soma = valor; /* inicializa as variáveis com o primeiro valor lido */
for (i=2; i <= n; i++) /* lê os próximos (n-1) valores */
22
for (i=2; i <= n; i++) /* lê os próximos (n-1) valores */
{
scanf("%f", &valor);
if (valor < *min) *min = valor; /* verifica se valor lido é o novo mínimo */
if (valor > *max) *max = valor; /* verifica se valor lido é o novo máximo */
soma += valor; /* soma o valor lido para o cálculo da média */
}
return soma/n;
}
int main(void)
{
float min, max, med = media(5, &min, &max); /* aqui, min e max são inteiros */
printf("min: %f, max: %f, media: %f\n", min, max, med);
return 0;
}
dúvidas?dúvidas?
23
Prof. Gustavo Moreira
gmoreira@inf.puc-rio.br

Outros materiais