Baixe o app para aproveitar ainda mais
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
Compartilhar