Baixe o app para aproveitar ainda mais
Prévia do material em texto
A18: Ponteiros e Parâmetros por referência Algoritmos e Programação Julio Toss jtoss@inf.ufrgs.br INF01202 – Algoritmos e Programação, 2018/01, Turmas G, H, K e L *baseado no material da prof. Mariana e do prof. Marcelo Walter Atenção: O material aqui contido não substitui a leitura do livro texto e é incompleto sem a apresentação do professor em aula. 2 Subprogramação Escopo de variáves Funções sem tipo Parâmetros Funções com tipo Semana passada void nome() { //código (…) } void nome(TIPO nome_param1, TIPO nome_param2, …) { //código (…) } TIPO nome() { //código (…) return retorno; } TIPO nome(TIPO nome_param1, TIPO nome_param2, …) { //código (…) return retorno; } 3 Funções: semana passada → Funções sem retorno (void): não retornam valor associado à função → sem parâmetros → com parâmetros → passados por valor passados por referência → Funções com retorno (tipadas): retornam um valor associado à função → sem parâmetros → com parâmetros → passados por valor passados por referência 4 Aula passada: maior ou menor de números positivos Escreva um programa que lê 3 números inteiros informados pelo usuário, garantindo que só serão aceitos valores positivos (>= 0, faça validação) e um indicador (m ou M, faça validação). Se o indicador for m, o programa calcula e retorna o menor dentre os números lidos. Se o indicador for M, ele calcula e retorna o maior dentre os números lidos. Seu programa deve estar baseado em subprogramação, contendo as seguintes funções (com os respectivos protótipos): int le_valor() //le um valor inteiro, retornando apenas valores validos char le_indicador() //le o indicador, retornando apenas valores validos int busca_maior(int, int, int) //recebe os 3 numeros lidos, e retorna o maior int busca_menor(int, int, int) //recebe os 3 numeros lidos, e retorna o menor A função main() deverá chamar cada função quando apropriado, e deverá ser a responsável por imprimir o valor do maior ou menor elemento retornado pela respectiva função. Obs.: você não deve usar vetores neste exercício (veremos na próxima semana!) 5 Exercicio aula passada 6 #include <stdio.h> int le_valor() { int valor; do{ printf("Informe um valor positivo: "); scanf("%d",&valor); if(valor <= 0) printf("Valor invalido!\n"); }while(valor <= 0); return valor; } char le_indicador() { char indicador; do{ printf("Informe o indicador (m ou M): "); scanf(" %c",&indicador); if(indicador != 'm' && indicador != 'M') printf("Indicador invalido!\n"); }while(indicador != 'm' && indicador != 'M'); return indicador; } int busca_maior(int a, int b, int c) { int maior; if (a > b) if (a > c) maior = a; else maior = c; else if (b > c) maior = b; else maior = c; return maior; } int busca_menor(int a, int b, int c) { int menor; if (a < b) if (a < c) menor = a; else menor = c; else if (b < c) menor = b; else menor = c; return menor; } Exercicio aula passada 7 int main(){ int v1, v2, v3; char ind; int res; v1=le_valor(); v2=le_valor(); v3=le_valor(); printf("Valores lidos: %d, %d e %d\n",v1, v2, v3); ind = le_indicador(); printf("Operação selecionada: %c\n",ind); if (ind == 'M'){ res = busca_maior(v1, v2, v3); printf("Maior valor: %d\n",res); } else{ res = busca_menor(v1, v2, v3); printf("Menor valor: %d\n",res); } return 0; } Passagem de parâmetros por valor Como visto na semana passada: ● Cada parâmetro passa somente um valor à função ● para cada parâmetro, é alocada uma área de uso local da função e o valor do argumento é copiado para esta área (valor inicial). ● alterações deste valor, durante o processamento da função, não alteram o valor da variável enviada pelo programa que chamou a função (argumento ou parâmetro real), apenas a cópia local, pois se tratam de variáveis locais independendentes 8 Passagem de parâmetros por valor: exemplo float calcula_media(float a, float b, float c) { float m; a = a / 3; b = b / 3; c = c / 3; m = (a+b+c); return m; } int main ( ) { float a=3.2, b=4.5, c=7.8, media; printf(“a = %3.2f b= %3.2f c = %3.2f\n”, a,b,c); media = calcula_media(a,b,c); printf(“A media vale %3.2f\n”, media); printf(“a = %3.2f b= %3.2f c = %3.2f\n”, a,b,c) return 0; } 9 a=3.20 b=4.50 c=7.80 A media vale 5.17 a=???? b=???? c=???? Passagem de parâmetros por valor: exemplo int main ( ) { float a=3.2, b=4.5, c=7.8, media; printf(“a = %3.2f b= %3.2f c = %3.2f\n”, a,b,c); media = calcula_media(a,b,c); printf(“A media vale %3.2f\n”, media); printf(“a = %3.2f b= %3.2f c = %3.2f\n”, a,b,c) return 0; } 10 a=3.20 b=4.50 c=7.80 A media vale 5.17 a=3.20 b=4.50 c=7.80 Os valores não mudam após a execução da função, pois foi passada à ela uma cópia dos valores de a, b e c. float calcula_media(float a, float b, float c) { float m; a = a / 3; b = b / 3; c = c / 3; m = (a+b+c); return m; } Funções: aula de hoje Funções sem retorno (void): não retornam valor associado à função sem parâmetros com parâmetros passados por valor → passados por referência Funções com retorno (tipadas): retornam um valor associado à função sem parâmetros com parâmetros passados por valor → passados por referência 11 Motivação Como trocar os valores de duas variáveis? int a = 1, b = 2, aux; aux = a; a = b; b = aux; Como fazer uma função auxiliar para isso? 1. // cabecalhos 2. #include <stdio.h> 3. 4. void troca(int a, int b) 5. { 6. int aux; 7. aux = a; 8. a = b; 9. b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca(a, b); 17. printf("a:%d b:%d\n", a, b); 18. } a:10 b:20 a:10 b:20 12 Motivação Como trocar os valores de duas variáveis? int a = 1, b = 2, aux; aux = a; a = b; b = aux; Como fazer uma função auxiliar para isso? 1. // cabecalhos 2. #include <stdio.h> 3. 4. void troca(int a, int b) 5. { 6. int aux; 7. aux = a; 8. a = b; 9. b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca(a, b); 17. printf("a:%d b:%d\n", a, b); 18. } a:10 b:20 a:10 b:20 visão do programador Nome Dado (...) (...) a (main) 10 b (main) 20 a (troca) 10 b (troca) 20 aux (troca) ? (...) (...) 13 Motivação Como trocar os valores de duas variáveis? int a = 1, b = 2, aux; aux = a; a = b; b = aux; Como fazer uma função auxiliar para isso? 1. // cabecalhos 2. #include <stdio.h> 3. 4. void troca(int a, int b) 5. { 6. int aux; 7. aux = a; 8. a = b; 9. b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca(a, b); 17. printf("a:%d b:%d\n", a, b); 18. } a:10 b:20 a:10 b:20 visão do programador Nome Dado (...) (...) a (main) 10 b (main) 20 a (troca) 10 b (troca) 20 aux (troca) 10 (...) (...) 14 Motivação Como trocar os valores de duas variáveis? int a = 1, b = 2, aux; aux = a; a = b; b = aux; Como fazer uma função auxiliar para isso? 1. // cabecalhos 2. #include <stdio.h> 3. 4. void troca(int a, int b) 5. { 6. int aux; 7. aux = a; 8. a = b; 9. b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca(a, b); 17. printf("a:%d b:%d\n", a, b); 18. } a:10 b:20 a:10 b:20 visão do programador Nome Dado(...) (...) a (main) 10 b (main) 20 a (troca) 20 b (troca) 20 aux (troca) 10 (...) (...) 15 Motivação Como trocar os valores de duas variáveis? int a = 1, b = 2, aux; aux = a; a = b; b = aux; Como fazer uma função auxiliar para isso? 1. // cabecalhos 2. #include <stdio.h> 3. 4. void troca(int a, int b) 5. { 6. int aux; 7. aux = a; 8. a = b; 9. b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca(a, b); 17. printf("a:%d b:%d\n", a, b); 18. } a:10 b:20 a:10 b:20 visão do programador Nome Dado (...) (...) a (main) 10 b (main) 20 a (troca) 20 b (troca) 10 aux (troca) 10 (...) (...) 16 Motivação Como trocar os valores de duas variáveis? int a = 1, b = 2, aux; aux = a; a = b; b = aux; Como fazer uma função auxiliar para isso? 1. // cabecalhos 2. #include <stdio.h> 3. 4. void troca(int a, int b) 5. { 6. int aux; 7. aux = a; 8. a = b; 9. b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca(a, b); 17. printf("a:%d b:%d\n", a, b); 18. } a:10 b:20 a:10 b:20 visão do programador Nome Dado (...) (...) a (main) 10 b (main) 20 a (troca) 20 b (troca) 10 aux (troca) 10 (...) (...) IMPORTANTE: as variáveis a e b da função main e a e b da função troca são independentes, sem nenhuma relação entre si!! 17 Os valores de a e b não foram trocados, porque a passagem de parâmetros foi feita por valor: - Variável local a da função troca é inicializada com conteúdo de a (argumento); - Variável local b da função troca é inicializada com conteúdo de b (argumento); - Dentro do subprograma, os valores de a e b da função troca são trocados, mas esta mudança é feita sobre as cópias locais dos valores e não é propagada para fora do subprograma, tal que a e b da função main permanecem com os valores originais. Ponteiros e Parâmetros por referência 18 Ponteiros Definição: variáveis que guardam e manipulam endereços de memória e o conteúdo dentro destes. Servem para que o programador possa acessar diretamente o local que a variável utiliza para armazenar os dados. 19 Rua Nascimento Silva, 107 Rua Nascimento Silva, 107 Ponteiros 20 Diferenciar entre o endereço (a50f118) de um assento no show e a pessoa (Maria) que está sentada no assento específico Memória Toda variável utilizada por um programa reside em determinado endereço de memória. Os nomes das variáveis são utilizados apenas pelo programador, como referência simbólica, para facilitar a escrita e a portabilidade do programa. O computador, ao executar o programa, utiliza apenas endereços para acessar o conteúdo das variáveis. 21 Memória Toda variável utilizada por um programa reside em determinado endereço de memória. Os nomes das variáveis são utilizados apenas pelo programador, como referência simbólica, para facilitar a escrita e a portabilidade do programa. O computador, ao executar o programa, utiliza apenas endereços para acessar o conteúdo das variáveis. 22 visão do programador Nome Dado (...) (...) a (main) 10 b (main) 20 a (troca) 20 b (troca) 10 aux (troca) 10 (...) (...) visão do computador Endereço Dado (...) (...) 9f5770010 10 9f5770014 20 9f5770018 20 9f5770022 10 9f5770026 10 (...) (...) Memória 23 AFA1 = 1010 1111 1010 0001 = 44961 Memória 1. // cabecalhos 2. #include <stdio.h> 3. 4. int main() { 5. int a=3; 6. char c='A'; 7. char string[3] = "oi"; 8. short int b=7; 9. 10. (…) 11. } visão do programador Nome Dado (...) (...) a (main) 3 c (main) 'A' string (main) "oi" b (main) 7 (...) (...) visão do computador Endereço Dado (...) (...) 9f5770010 3 9f5770011 0 9f5770012 0 9f5770013 0 9f5770014 65 9f5770015 111 9f5770016 105 9f5770017 0 9f5770018 7 9f5770019 0 24 Memória 1. // cabecalhos 2. #include <stdio.h> 3. 4. int main() { 5. int a=3; 6. char c='A'; 7. char string[3] = "oi"; 8. short int b=7; 9. 10. (…) 11. } visão do programador Nome Dado (...) (...) a (main) 3 c (main) 'A' string (main) "oi" b (main) 7 (...) (...) visão do computador Endereço Dado (...) (...) 9f5770010 3 9f5770011 0 9f5770012 0 9f5770013 0 9f5770014 65 9f5770015 111 9f5770016 105 9f5770017 0 9f5770018 7 9f5770019 0 25 Memória 1. // cabecalhos 2. #include <stdio.h> 3. 4. int main() { 5. int a=3; 6. char c='A'; 7. char string[3] = "oi"; 8. short int b=7; 9. 10. (…) 11. } visão do programador Nome Dado (...) (...) a (main) 3 c (main) 'A' string (main) "oi" b (main) 7 (...) (...) visão do computador Endereço Dado (...) (...) 9f5770010 00000011 9f5770011 00000000 9f5770012 00000000 9f5770013 00000000 9f5770014 01000001 9f5770015 01101111 9f5770016 01101001 9f5770017 00000000 9f5770018 00000111 9f5770019 00000000 em binário ;-) 26 Sintaxe: Declaração: TIPO *nome; Exemplos: float *f; // f é um ponteiro para variáveis do tipo float int *p; // p é um ponteiro para variáveis do tipo inteiro char *a, b, *p, c, *q; // pode declarar junto com variáveis // de mesmo tipo Ponteiro: sintaxe 27 Sintaxe: Declaração: TIPO *nome; Exemplos: float *f; // f é um ponteiro para variáveis do tipo float int *p; // p é um ponteiro para variáveis do tipo inteiro char *a, b, *p, c, *q; // pode declarar junto com variáveis // de mesmo tipo Ponteiro: sintaxe 28 Asterisco indica que a variável armazena um endereço de memória, cujo conteúdo é do tipo especificado. Qualquer tipo de dado válido em C! Ponteiro: sintaxe Porque os ponteiros tem que possuir um tipo? Lembrando: Tipos de Dados ● Diferentes tipos de dados necessitam de um número diferente de bytes de memória para armazenar seu conteúdo. ● A declaração do tipo de dado indica o número de bytes reservados para conteúdos: char a = ‘Z’; //1 byte int n = 1234; //4 bytes float PI = 3.1415; //4 bytes ● O endereço de uma variável é sempre o MENOR dos endereços, isto é, o endereço inicial. ● Um ponteiro para um tipo qualquer indica também sempre o número de bytes que esse tipo ocupa. 29 Podem variar entre diferentes arquiteturas. Para verificar: sizeof(tipo) Z 1234 3.1415 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 Ponteiro: sintaxe Operador Nome Ex Descrição * Derreferência de ponteiro *p Derreferencia o ponteiro p. “Acessa o endereço de memória em p.” & Endereço de variável &v Criar um ponteiro que referencia a variável v. “Obtém o endereço de memória de v. 30 Voltando ao show do U2... 31 Maria está sentada no assento 50 da fila 118 João está sentado no assento 43 da fila 77 O ingresso no assento 23 da fila 102 não foi vendido Qual o “conteúdo” de a50f118? *a50f118 = ? Onde está sentado Joao? &Joao= ? Qual o “conteúdo” de a23f102? *a23f102= ? Maria a43f77 Lixo! Não há como garantir o conteúdo Sintaxe: Atribuição: nome = expressão; // expressão: endereço de alguma variável *nome = expressão; // expressão: valor a ser armazenado no // endereço apontado pelo ponteiro Ponteiro: sintaxe Exemplo: char c = 'A', *ptr; ptr = &c; //Variável ptr recebe endereço da variável c Exemplo: ptr = &c; *ptr = 'B'; printf("%c", c); // qual caractere vai mostrar? 32 Ponteiro: exemplo 1 #include <stdio.h> #include <stdlib.h> int main() { int count, q, *m; m = &count;// recebe endereço de count count = 60; q = *m; // recebe valor apontado por m printf("m = %p\n", m); // %p para imprimir em formato de endereço de memoria printf("q = %d\n", q); // conteúdo apontado por m printf("conteudo do endereco apontado por m: %d\n\n", *m); return 0; } 33 Ponteiro: exemplo 1 #include <stdio.h> #include <stdlib.h> int main() { int count, q, *m; m = &count; // recebe endereço de count count = 60; q = *m; // recebe valor apontado por m printf("m = %p\n", m); // %p para imprimir em formato de endereço de memoria printf("q = %d\n", q); // conteúdo apontado por m printf("conteudo do endereco apontado por m: %d\n\n", *m); return 0; } 34 Ponteiro: exemplo 1 #include <stdio.h> #include <stdlib.h> int main() { int count, q, *m; m = &count; // recebe endereço de count count = 60; q = *m; // recebe valor apontado por m printf("m = %p\n", m); // %p para imprimir em formato de endereço de memoria printf("q = %d\n", q); // conteúdo apontado por m printf("conteudo do endereco apontado por m: %d\n\n", *m); return 0; } visão do programador Nome Dado (...) (...) count (main) 60 q (main) 60 *m (main) & count (main) (...) (...) visão do computador Endereço Dado (...) (...) a43bf11190 60 a43bf11194 60 a43bf11198 a43bf11190 (...) (...) 35 Ponteiro: exemplo 2 #include <stdio.h> #include <stdlib.h> int main() { int x = 200, *p1, *p2; p1 = &x; // p1 aponta para x p2 = p1; // p2 recebe p1 e também passa a apontar para x printf("x - %d, p1=%p e p2=%p\n", x, p1, p2); // endereço de x printf("x - %d, p1=%d e p2=%d\n",x,*p1, *p2); // conteúdo de x return 0; } 36 x - 200, p1=0022FF60 e p2 = 0022FF60 x - 200, p1=200 e p2 = 200 Ponteiro: exemplo 3 #include <stdio.h> #include <stdlib.h> int main() { int a, *x, *y; a = 10; x = &a; y = x; printf("a = %d, *x = %d, *y = %d \n",a,*x, *y); printf("a = %d, x = %p, y = %p\n\n", a, x, y); *x = 20; printf("a = %d, *x = %d, *y = %d \n",a, *x, *y); printf("a = %d, x = %p, y = %p\n\n", a, x, y); return 0; } 37 Ponteiro: erro comum 1 #include <stdio.h> #include <stdlib.h> int main() { float x; int *p; x = 100; p = &x; printf("x=%f p=%p\n\n", x,p); return 0; } 38 Ponteiro: erro comum 1 #include <stdio.h> #include <stdlib.h> int main() { float x; int *p; x = 100; p = &x; printf("x=%f p=%p\n\n", x,p); return 0; } WARNING: atribuição de um tipo incompatível de ponteiro P é um ponteiro para inteiros, logo não pode apontar para um float! 39 Ponteiro: erro comum 2 #include <stdio.h> #include <stdlib.h> int main() { int x; int *p; x = 100; *p = x; printf("x=%d p=%p\n\n", x,p); return 0; } 40 Ponteiro: erro comum 2 #include <stdio.h> #include <stdlib.h> int main() { int x; int *p; x = 100; *p = x; printf("x=%d p=%p\n\n", x,p); return 0; } Undefined Behavior: Comportamento não definido (imprevisível) Possível erro de execução: p não foi inicializado. quando p foi criado, ele aponta para um endereço de memória desconhecido. Resultado imprevisível!!! Compilador não avisará e o programa executará, porém provavelmente irá falhar. 41 Ponteiro: erro comum 2 (fixed) #include <stdio.h> #include <stdlib.h> int main() { int x; int *p; x = 100; p = &x; printf("x=%d p=%p\n\n", x,p); return 0; } 42 Obs: inicialização de ponteiros Ponteiros não devem ser utilizados sem prévia inicialização. Exemplo correto abaixo: int x; float pi = 3.14; int *ptr_x = &x; float *ptr_to_pi = π No entanto, podem existir situações* em que não se quer inicialmente que um ponteiro aponte uma variável. Nesse caso, deve-se inicializar o ponteiro com NULL. Exemplo: int a = 5, b = 7; int *ptr = NULL; *estas situação virão em outras disciplinas Funções: aula de hoje Funções sem retorno (void): não retornam valor associado à função sem parâmetros com parâmetros passados por valor → passados por referência Funções com retorno (tipadas): retornam um valor associado à função sem parâmetros com parâmetros passados por valor → passados por referência 43 Sintaxe 5: funções sem tipo e com parâmetros por referência Protótipo: void nome(TIPO*, …); Implementação: void nome(TIPO* nome_param1, …) { //código (…) } Chamada: nome(&variável, …); Funções definidas pelo usuário 44 Sintaxe 6: funções tipadas com parâmetros por referência Protótipo: TIPO nome(TIPO*, …); Implementação: TIPO nome(TIPO* nome_param1, …) { //código (…) return retorno; } Chamada: TIPO variável0 = nome(&variável1, …); Funções definidas pelo usuário 45 Funções tipadas: exemplos 1. // cabecalhos 2. #include <stdio.h> 3. 4. // funcoes 5. void troca(int a, int b) { 6. 7. 8. 9. 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca( a, b); 17. printf("a:%d b:%d\n", a, b); 18. } 46 Funções tipadas: exemplos 1. // cabecalhos 2. #include <stdio.h> 3. 4. // funcoes 5. void troca(int* a, int* b) { 6. int aux; 7. aux = a; 8. a = b; 9. b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca( a, b); 17. printf("a:%d b:%d\n", a, b); 18. } Nome Dado (...) (...) a (main) 10 b (main) 20 *a (troca) 10 *b (troca) 20 aux (troca) ? (...) (...) 47 Funções tipadas: exemplos 1. // cabecalhos 2. #include <stdio.h> 3. 4. // funcoes 5. void troca(int* a, int* b) { 6. int aux; 7. aux = a; 8. a = b; 9. b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca( a, b); 17. printf("a:%d b:%d\n", a, b); 18. } Nome Dado (...) (...) a (main) 10 b (main) 20 *a (troca) 20 *b (troca) 10 aux (troca) 10 (...) (...) X 48 Funções tipadas: exemplos 1. // cabecalhos 2. #include <stdio.h> 3. 4. // funcoes 5. void troca(int* a, int* b) { 6. int aux; 7. aux = a; 8. a = b; 9. b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca( &a, &b); 17. printf("a:%d b:%d\n", a, b); 18. } Nome Dado (...) (...) a (main) 10 b (main) 20 *a (troca) & a (main) *b (troca) & b (main) aux (troca) ? (...) (...) 49 Funções tipadas: exemplos 1. // cabecalhos 2. #include <stdio.h> 3. 4. // funcoes 5. void troca(int* a, int* b) { 6. int aux; 7. aux = a; 8. a = b; 9. b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca( &a, &b); 17. printf("a:%d b:%d\n", a, b); 18. } Nome Dado (...) (...) a (main) 10 b (main) 20 *a (troca) & b (main) *b (troca) & a (main) aux (troca) & a (main) (...) (...) X 50 Funções tipadas: exemplos 1. // cabecalhos 2. #include <stdio.h> 3. 4. // funcoes 5. void troca(int* a, int* b) { 6. int aux; 7. aux =&a; 8. a =&b; 9. b =&aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca( &a, &b); 17. printf("a:%d b:%d\n", a, b); 18. } Nome Dado (...) (...) a (main) 10 b (main) 20 *a (troca) & a(main) *b (troca) & b (main) aux (troca) ? (...) (...) 51 Funções tipadas: exemplos 1. // cabecalhos 2. #include <stdio.h> 3. 4. // funcoes 5. void troca(int* a, int* b) { 6. int aux; 7. aux =&a; 8. a =&b; 9. b =&aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca( &a, &b); 17. printf("a:%d b:%d\n", a, b); 18. } Nome Dado (...) (...) a (main) 10 b (main) 20 *a (troca) & b (troca) *b (troca) & aux (troca) aux (troca) & a (troca) (...) (...) X 52 Funções tipadas: exemplos 1. // cabecalhos 2. #include <stdio.h> 3. 4. // funcoes 5. void troca(int* a, int* b) { 6. int aux; 7. aux = *a; 8. *a = *b; 9. *b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca( &a, &b); 17. printf("a:%d b:%d\n", a, b); 18. } Nome Dado (...) (...) a (main) 10 b (main) 20 *a (troca) & a (main) *b (troca) & b (main) aux (troca) ? (...) (...) 53 Funções tipadas: exemplos 1. // cabecalhos 2. #include <stdio.h> 3. 4. // funcoes 5. void troca(int* a, int* b) { 6. int aux; 7. aux = *a; 8. *a = *b; 9. *b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca( &a, &b); 17. printf("a:%d b:%d\n", a, b); 18. } Nome Dado (...) (...) a (main) 20 b (main) 10 *a (troca) & a (main) *b (troca) & b (main) aux (troca) 10 (...) (...) v 54 Funções tipadas: exemplos 1. // cabecalhos 2. #include <stdio.h> 3. 4. // funcoes 5. void troca(int* a, int* b) { 6. int aux; 7. aux = *a; 8. *a = *b; 9. *b = aux; 10. } 11. 12. int main() { 13. int a=10, b=20; 14. 15. printf("a:%d b:%d\n", a, b); 16. troca( &a, &b); 17. printf("a:%d b:%d\n", a, b); 18. } Nome Dado (...) (...) a (main) 20 b (main) 10 *a (troca) & a (main) *b (troca) & b (main) aux (troca) 10 (...) (...) v 55 Assim como precisamos ter compatibilidade entre tipo de dados (int, char, float) declarado e enviado como parâmetro, também deve haver compatibilidade entre tipo de variável (simples/ponteiro) declarada e enviada como parâmetro Exercício: baskara Faça um programa que receba três valores reais a, b e c, e que retorne as duas raízes x1 e x2 da equação: ax2 + bx + c = 0. Assuma que a equação de segundo grau possui raízes reais. #include<stdio.h> #include<math.h> void baskara(float, float, float, float*, float*); 56 Exercício: baskara Faça um programa que receba três valores reais a, b e c, e que retorne as duas raízes x1 e x2 da equação: ax2 + bx + c = 0. Assuma que a equação de segundo grau possui raízes reais. #include<stdio.h> #include<math.h> void baskara(float, float, float, float*, float*); void baskara(float a, float b, float c, float* x1, float* x2) { float delta; delta = sqrt(b*b-4*a*c); *x1 = (-b + delta)/(2*a); *x2 = (-b - delta)/(2*a); } int main() { float a, b, c, x1, x2; scanf("%f %f %f", &a, &b, &c); baskara(a, b, c, &x1, &x2); printf("raizes: %f e %f", x1, x2); return 0; } 57
Compartilhar