Baixe o app para aproveitar ainda mais
Prévia do material em texto
Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções AED1 - Aula 01 Introdução e Revisão Prof. Hebert Coelho da Silva Profa. Nádia Félix Felipe da Silva Prof. Wanderley de Souza Alencar Instituto de Informática Universidade Federal de Goiás NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Roteiro Detalhes do curso Plano de Ensino Sharif Judge System Revisão Tipos Construídos Alocação Dinâmica Funções Exercícios Laboratório NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Registro Definição Um registro é uma estrutura que contém diversas variáveis (chamadas de campos), usualmente de tipos diferentes, mas que dentro de um determinado contexto, fazem sentido se agrupadas. Podemos comparar um registro com uma ficha que possui todos os dados sobre uma determinada entidade, por exemplo: Registro de alunos (nome, RA, médias de provas, médias de labs, etc...) Registro de produtos (Nome, código, descrição, etc...) NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Declarando o formato do registro Para criar um registro é preciso declarar seu formato/estrutura. Isso é feito utilizando a palavra chave struct, da seguinte forma: struct nome_do_tipo_do_registro { tipo_1 nome_1; tipo_2 nome_2; tipo_3 nome_3; ... tipo_n nome_n; }; NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Declarando o formato do registro #include <stdio.h> struct aluno { int mat; //matricula float media; }; int main () { struct aluno j; j.mat = 10; j.media = 8.5; printf(“Matricula %d, media %f.”, j.mat, j.media); } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Lendo os campos de um Registro A leitura dos campos de um registro a partir do teclado deve ser feita campo a campo, como se fossem variáveis independentes. printf (“Digite a matricula do aluno: ”); scanf (“%d”, &j.mat); printf (“Digite a média do aluno: ”); scanf (“%f”, &j.media); NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Copiando registros A cópia de um registro pode ser feita como se fosse a cópia de uma variável normal, ou seja registro_1 = registro_2; NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Vetor de registros Registros podem ser declarados como um vetor. #include <stdio.h> struct aluno { int mat; //matricula float media; }; int main () { struct aluno turma[40]; turma[0].mat = 10; turma[0].media = 8.5; ... } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Registros Aninhados Também é possível declarar um registro como uma das variáveis de um registro, quantas vezes isso for necessário. #include <stdio.h> struct notas { float p1; float p2; float p3; }; typedef struct notas NotasAluno; struct aluno { int mat; //matricula NotasAluno provas; }; NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções sizeof O operador unário sizeof calcula o tamanho de qualquer variável ou tipo Construído. sizeof retorna um valor inteiro, assim seu resultado pode ser apresentado na tela com comando printf. Exemplo: int i; printf(“%d”, sizeof(i)); O printf acima, imprime o tamanho da variável inteira i. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Alocação Dinâmica Existem 2 maneiras fundamentais de um programa em C armazenar informações na memória principal do computador. Variáveis locais e globais, incluindo matrizes e estruturas; Armazenamento fixo durante toda a execução do programa. Alocação Dinâmica Nesta maneira o programa pode obter espaço para armazenamento em tempo de execução. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções C ANSI O padrão C ANSI especifica apenas quatro funções para o sistema de alocação dinâmica: calloc(); malloc(); free(); realloc(); As funções de alocação dinâmica definidas pelo padrão C ANSI estão na biblioteca stdlib.h NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções calloc() void *calloc(size_t num, size_t size); A função calloc() aloca uma quantidade de memória igual a num×size. Ou seja, calloc() aloca memória suficiente para uma matriz de num objetos de tamanho size; A função devolve um ponteiro para o primeiro byte da região alocada; Se não houver memória suficiente é devolvido um ponteiro nulo. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções calloc - Exemplo de uso do calloc 1 #include<stdlib.h> 2 #include<stdio.h> 3 4 float ∗get_mem(void){ 5 float ∗p; 6 7 p=calloc(100, sizeof(float)); 8 if(!p){ 9 printf("Erro de alocação − abortando."); 10 exit(1); 11 } 12 return p; 13 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções malloc() void *malloc(size_t size); A função malloc() devolve um ponteiro para o primeiro byte de uma região de memória de tamanho size que foi alocada do heap; Se não houver memória suficiente é devolvido um ponteiro nulo; Sempre verificar se o valor devolvido não é um ponteiro nulo antes de utilizá-lo; NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções malloc - Exemplo de uso do malloc 1 #include<stdlib.h> 2 #include<stdio.h> 3 4 struct endereco{ 5 char nome[40]; 6 char rua[40]; 7 char cidade[40]; 8 char estado[2]; 9 }; 10 11 struct endereco ∗get_struct(void){ 12 struct endereco ∗p; 13 14 if ((p = malloc(sizeof(struct endereco)))==NULL){ 15 printf("Erro de alocação"); 16 exit(1); 17 } 18 return p; 19 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funçõesfree() void free(void *ptr); A função free() devolve ao heap a memória apontada por ptr, tornando a memória disponível para alocação futura. free() deve ser chamado apenas com um ponteiro que foi previamente alocado com as funções de alocação dinâmica. Um ponteiro inválido pode destruir o mecanismo de gerenciamento de memória; NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções free - Exemplo de uso do free 1 #include<stdlib.h> 2 #include<stdio.h> 3 #include<string.h> 4 #define tam 3 5 int main (){ 6 char ∗str[tam]; 7 int i; 8 for (i=0; i<tam; i++){ 9 if ((str[i] = malloc(128))==NULL){ 10 printf("Erro de alocação"); 11 exit(1); 12 } 13 gets(str[i]); 14 puts(str[i]); 15 } 16 for (i=0; i<tam; i++) free(str[i]); 17 return 0; 18 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções realloc() void *realloc(void *ptr, size_t size); A função realloc() modifica o tamanho da memória previamente alocada apontada por ptr para aquele especificado por size; O valor de size pode ser maior ou menor que o original; Um ponteiro para o bloco de memória é devolvido porque realloc() pode precisar mover o bloco para aumentar o seu tamanho; . . . NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções realloc() void *realloc(void *ptr, size_t size); . . . Se precisar mover o bloco, o conteúdo do bloco antigo é copiado no novo bloco, nenhuma informação é perdida. Se size é zero, a memória apontada por ptr é liberada. Se não há memória livre suficiente no heap é devolvido um ponteiro nulo e o bloco original é deixado inalterado. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções realloc - Exemplo de uso do realloc 1 #include<stdlib.h> 2 #include<stdio.h> 3 #include<string.h> 4 int main (){ 5 char ∗p; 6 if ((p = malloc(23))==NULL){ 7 printf("Erro de alocação"); 8 exit(1); 9 } 10 strcpy(p, "isso são 22 caracteres"); 11 p = realloc(p,24); 12 if(!p){ 13 printf("Erro de alocação"); 14 exit(1); 15 } 16 strcat(p,"."); 17 printf(p); 18 free(p); 19 return 0; 20 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Funções - Dividindo Tarefas? NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Por que dividir o código em funções? Dividir o código em módulos - Alinhar com orientação a objetos. Reuso: Reuso de código desenvolvido por outros programadores. Exemplo: Funções de entrada e saída são o exemplo mais direto deste reuso. Vantagens: Diminui o tempo de desenvolvimento do programas. Vantagens: Funções foram testadas por diversos usuários contribuindo para a redução dos custos de desenvolvimento dos projetos. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Forma Geral 1 tipo nome (tipo nome1, tipo nome2, ..., tipo nomeN ) { 2 declaração das variáveis 3 corpo da função 4 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções E daí? Uma função recebe uma lista de argumentos (nome1, nome2, ..., nomeN), executa comandos com estes argumentos e pode retornar ou não um resultado para a função que chamou esta função. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Funções #include<stdio.h> void function_name(void) { .... .... } int main (void) { .... .... function_name(); .... return 0; } Chamada Retorno NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Observações A lista de argumentos, também chamados de parâmetros, é uma lista, separada por vírgulas, de variáveis com seus tipos associados. Não é possível usar uma única definição de tipo para várias variáveis. A lista de argumentos pode ser vazia, ou seja, a função não recebe nenhum argumento. O nome da função pode ser qualquer identificador válido. O tipo que aparece antes do nome da função especifica o tipo do resultado que será devolvido ao final da execução da função. O tipo void pode ser usado para declarar funções que não retornam valor algum. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Retornando. Há basicamente duas maneiras de terminar a execução de uma função. Normalmente usa-se o comando return para retornar o resultado da função. Portanto, quando o comando return expressão; for executado, o valor da expressão é devolvido para a função que chamou. Quando não há valor para retornar o comando return não precisa ser usado e a função termina quando a chave que indica o término do corpo da função é atingido. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Exemplo #include<stdio.h> float media(float n1, float n2) { return (n1 + n2)/2; } int main (void) { float nt1, nt2, nt3, nt4; float m1, m2; scanf("%f %f %f %f", &nt1, &nt2, &nt3, &nt4); m1 = media(nt1, nt2); m2 = media(nt3, nt4); printf("%f %f\n", m1, m2); return 0; } ParâmetrosTipo função Retorno Nome Chamadas NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Observações É importante notar que o nome da função pode aparecer em qualquer lugar onde o nome de uma variável apareceria. Além disso os tipos e o número de parâmetros que aparecem na declaração da função e na sua chamada devem estar na mesma ordem e ser tipos equivalentes. Os nomes das variáveis nos programas que usam uma função podem ser diferentes dos nomes usados na definição da função. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Exemplo 1 #include<stdio.h> 2 int fat(int n) { 3 int f = 1; 4 5 for ( ; n>1; n−−) { 6 f ∗= n; 7 } 8 return f; 9 } 10 int main ( void ) { 11 int n, p, c; 12 n = 5; p = 3; 13 c = fat(n) / (fat(p) ∗ fat(n−p)); 14 printf("%d \n", c); 15 return 0; 16 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetoresem funções Protótipos O padrão ANSI estendeu a declaração da função para permitir que o compilador faça uma verificação mais rígida da compatibilidade entre os tipos que a função espera receber e àqueles que são fornecidos. Protótipos de funções ajudam a detectar erros antes que eles ocorram, impedindo que funções sejam chamadas com argumentos inconsistentes. A forma geral de definição de um protótipo é a seguinte: tipo nome (tipo nome1, tipo nome2, ..., tipo nomeN); NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Protótipos O padrão ANSI estendeu a declaração da função para permitir que o compilador faça uma verificação mais rígida da compatibilidade entre os tipos que a função espera receber e àqueles que são fornecidos. Protótipos de funções ajudam a detectar erros antes que eles ocorram, impedindo que funções sejam chamadas com argumentos inconsistentes. A forma geral de definição de um protótipo é a seguinte: tipo nome (tipo nome1, tipo nome2, ..., tipo nomeN); NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Exemplo 1 #include<stdio.h> 2 3 /∗ Prototipo da funcao ∗/ 4 int soma (int a, int b); 5 6 /∗ Funcao Principal ∗/ 7 int main() { 8 int a=5, b=9; 9 printf("%d\n", soma(a,b)); 10 return 0; 11 } 12 13 /∗ Definicao da funcao ∗/ 14 int soma(int a, int b) { 15 return a+b; 16 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Variáveis Locais Variáveis Globais Parâmetros Formais Escopo de Variáveis Variáveis podem ser definidas para serem usadas somente dentro de uma função particular, ou pode ocorrer que variáveis precisem ser acessíveis à diversas funções diferentes. Por esta razão, temos que apresentar os locais onde as variáveis de um programa podem ser definidas e a partir destes locais podermos inferir onde elas estarão disponíveis. As variáveis podem ser declaradas basicamente em três lugares: dentro de funções, variáveis locais fora de todas as funções, variáveis globais na lista de parâmetros das funções parâmetros formais. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Variáveis Locais Variáveis Globais Parâmetros Formais Escopo de Variáveis int main() int i, j; ... ... j = f(i) int f(int i) int s, t; ... return s; int k; /* global */ bum! pá! NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Variáveis Locais Variáveis Globais Parâmetros Formais Variáveis Locais As variáveis locais são aquelas declaradas dentro de uma função ou um bloco de comandos. Elas passam a existir quando do início da execução do bloco de comandos ou função onde foram definidas e são destruídas ao final da execução do bloco. Uma variável local só pode ser referenciada, ou seja usada, dentro da função (ou bloco) onde foi declarada. Variáveis locais são invisíveis para outras funções do mesmo programa. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Variáveis Locais Variáveis Globais Parâmetros Formais Exemplo 1 #include <stdio.h> 2 void pares(void) { 3 int i; 4 for (i = 2; i <= 10; i += 2) { 5 printf("%d: ", i); 6 } 7 } 8 void impares(void) { 9 int i; 10 for (i = 3; i <= 11; i += 2) { 11 printf("%d: ", i); 12 } 13 } 14 int main(int argc, char *argv[]) { 15 pares(); 16 printf("\n"); 17 impares(); 18 return 0;} NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Variáveis Locais Variáveis Globais Parâmetros Formais Variáveis Globais As variáveis globais são definidas fora de qualquer função e são portanto disponíveis para qualquer função. Este tipo de variável pode servir como uma canal de comunicação entre funções, uma maneira de transferir valores entre elas. Por exemplo, se duas funções tem de partilhar dados, mais uma não chama a outra, uma variável global tem de ser usada. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Variáveis Locais Variáveis Globais Parâmetros Formais Variáveis Globais 1 #include <stdio.h> 2 int i; /* variavel global */ 3 void soma1(void) { 4 i += 1; 5 printf("Funcao soma1: i = %d\n", i); 6 } 7 void sub1(void) { 8 int i = 10; 9 i -= 1; 10 printf("Funcao sub1: i = %d\n", i); 11 } 12 int main(int argc, char *argv[]) { 13 i = 0; 14 soma1(); 15 sub1(); 16 printf("Funcao main: i = %d\n", i); 17 return 0; 18 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Variáveis Locais Variáveis Globais Parâmetros Formais Resultados O resultado da execução deste programa é o seguinte: Funcao soma1: i = 1 Funcao sub1: i = 9 Funcao main: i = 1 Observe que a variável global i recebe o valor 0 no início da função main. A função soma1 ao executar um comando que aumenta o valor de i em uma unidade está aumentando a variável global. Em seguida vemos que a função sub1 define uma variável local também chamada i e, portanto, a alteração feita por esta função somente modifica esta variável. Finalmente, a função main imprime o valor final da variável global. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Variáveis Locais Variáveis Globais Parâmetros Formais Parâmetros Formais As variáveis que aparecem na lista de parâmetros da função são chamadas de parâmetros formais. Eles são criados no início da execução da função e destruídos no final. Normalmente os parâmetros são inicializados durante a chamada da função, pois para isto foram criados. No entanto, as variáveis que atuam como parâmetros são iguais a todas as outras e podem ser modificadas, operadas, etc, sem nenhuma restrição. Parâmetros podem ser passados para funções: por valor ou por referência. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Passagem por valor Na passagem por valor uma cópia do valor do argumento é passado para a função. Neste caso a função que recebe este valor, ao fazer modificações no parâmetro, não estará alterando o valor original que somente existe na função que chamou. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Exemplo 1 #include<stdio.h> 2 float Eleva(floata, int b) { 3 float res = 1.0; 4 for ( ; b>0; b--) res *= a; 5 return res; 6 } 7 int main() { 8 float numero; 9 int potencia; 10 11 puts("Entre com um numero"); 12 scanf("%f", &numero); 13 puts("Entre com a potencia"); 14 scanf("%d", &potencia); 15 printf("%f Elevado a %d e igual a %f\n", 16 numero, potencia, Eleva(numero, potencia)); 17 return 0; 18 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Outro exemplo 1 #include <stdio.h> 2 void trocar(int a, int b) { 3 int temp; 4 temp = a; a = b; b = temp; 5 } 6 7 int main(int argc, char *argv[]) { 8 int a = 10, b = 20; 9 trocar(a, b); 10 printf("a = %d, b = %d\n", a, b); 11 12 return 0; 13 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Passagem por Referência Na passagem por referência o que é passado para a função é o endereço do parâmetro e, portanto, a função que recebe pode, através do endereço, modificar o valor do argumento diretamente na função que chamou. Para a passagem de parâmetros por referência é necessário o uso de ponteiros. Isto será visto na próxima apresentação. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Passagem de Vetores e Matrizes Matrizes são um caso especial e exceção a regra que nomes de variáveis como parâmetros indicam passagem por valor. Como veremos mais adiante, o nome de um vetor corresponde ao endereço do primeiro elemento do array. Quando um nome de vetor é passado como parâmetro o endereço do primeiro elemento é passado. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Passagem de Vetores e Matrizes Existem basicamente três maneiras de declarar um vetor como um parâmetro de uma função. Na primeira ele é declarado segundo as regras de declaração de uma variável do tipo vetor. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Exemplo primeiro caso 1 #include<stdio.h> 2 #define DIM 80 3 int conta (char v[DIM], char c); 4 int main() { 5 char c, linha[DIM]; 6 int maiusculas[26], minusculas[26]; 7 gets (linha); 8 for (c = a; c <= z; c++) 9 minusculas[c-a] = conta(linha, c); 10 for (c = A; c <= Z; c++) 11 maiusculas[c-A] = conta(linha, c); 12 for (c = a; c <= z; c++) 13 if (minusculas[c-a]) 14 printf("%c apareceu %d vezes\n", c, minusculas[c- a]); 15 for (c = A; c <= Z; c++) 16 if (maiusculas[c-A]) 17 printf("%c apareceu %d vezes\n", c, maiusculas[ c-A]); 18 return 0; 19 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Exemplo primeiro caso 1 #include<stdio.h> 2 #define DIM 80 3 int conta (char v[DIM], char c) { 4 int i=0, vezes=0; 5 while (v[i] != \0) 6 if (v[i++] == c) vezes++; 7 return vezes; 8 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Segundo caso Uma outra maneira, leva em conta que apenas o endereço do vetor é passado. Neste modo o parâmetro é declarado como um vetor sem dimensão. Isto é perfeitamente possível porque a função somente precisa receber o endereço onde se encontra o vetor. C não confere onde estão os limites de vetores e portanto a função precisa do endereço inicial do vetor e uma maneira de descobrir o final do vetor. Esta maneira pode ser, por exemplo, uma constante, ou o caractere ’\0’ em um vetor de caracteres. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Exemplo segundo caso 1 2 #include<stdio.h> 3 #define DIM 6 4 void Le_vetor (int v[], int tam); 5 void Imprime_vetor (int v[], int tam); 6 void Inverte_vetor (int v[], int tam); 7 8 int main() { 9 int v[DIM]; 10 11 Le_vetor(v, DIM); 12 Imprime_vetor (v, DIM); 13 Inverte_vetor (v, DIM); 14 Imprime_vetor (v, DIM); 15 return 0; 16 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Exemplo segundo caso 1 void Le_vetor (int v[], int tam) { 2 int i; 3 for ( i = 0; i < tam; i++) { 4 printf("%d = ? ", i); scanf("%d", &v[i]); 5 } 6 } 7 void Imprime_vetor (int v[], int tam) { 8 int i; 9 for (i = 0; i < tam; i++) 10 printf("%d = %d\n", i, v[i]); 11 } 12 void Inverte_vetor (int v[], int tam) { 13 int i, temp; 14 for (i = 0; i < tam/2; i++){ 15 temp = v[i]; 16 v[i] = v[tam-i-1]; 17 v[tam-i-1] = temp; 18 } 19 } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Passagem de Vetores e Matrizes A terceira maneira de passagem de parâmetros implica no uso de ponteiros NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de argumentos por valor Quando passamos argumentos a uma função, os valores fornecidos são copiados para os parâmetros da função. Este processo é idêntico a uma atribuição. Desta forma, alterações nos parâmetros dentro da função não alteram os valores que foram passados. Exemplo void nao_troca(int x, int y) { int aux; aux = x; x = y; y = aux; } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de argumentos por referência Existe uma forma de alterarmos as variáveis passadas como argumento, ao invés de usarmos apenas o seu valor. O artifício é passarmos como argumento o endereço da variável, e não o seu valor. Para indicarmos que será passado o endereço do argumento, usamos o mesmo tipo que usamos para declarar um variável que guarda um endereço. Exemplo tipo nome (tipo *parâmetro1, ..., tipo *parâmetroN) { comandos; } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores emfunções Passagem de argumentos por referência Um endereço de uma variável passado como parâmetro não é muito útil. Para acessarmos o valor de uma variável apontada por um endereço, usamos o operador *; Ao precedermos uma variável que contém um endereço com este operador, obtemos o equivalente a variável armazenada no endereço em questão; Exemplo void troca(int *x, int *y) { int aux; aux = *x; *x = *y; *y = aux; } NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Passagem de argumentos por referência Uma outra forma de conseguirmos alterar os valores de variáveis externas a funções é usando variáveis globais; Nesta abordagem usamos variáveis globais no lugar de parâmetros e de valores de retorno; Porém, ao usar esta técnica estamos negando uma das principais vantagens de se usar funções, reaproveitamento de código. NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Vetores em funções Vetores têm um comportamento diferente quando usados como parâmetros ou valores de retorno de funções; Por padrão, um vetor é interpretado pelo compilador como o endereço do primeiro elemento do vetor; Desta forma, sem precisarmos usar uma notação especial, os vetores são sempre passados por referência. Maneiras para declarar um parâmetro que receberá um vetor void display(int num[10]) void display(int num[]) void display(int *num) // Forma mais usada NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Vetores em funções Ao passar um vetor como parâmetro não é necessário fornecer o seu tamanho na declaração da função. Porém, é importante lembrar que o vetor tem um tamanho que deve ser considerado. Quando o vetor é multi-dimensional a possibilidade de não informar o tamanho na declaração se restringe apenas a primeira dimensão. Maneiras para declarar um parâmetro que receberá um vetor void display(int num[10]) void display(int num[]) void display(int *num) // Forma mais usada NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Passagem de Parâmetros por Valor Passagem de argumentos por valor e por referência Vetores em funções Fim Por hoje é tudo pessoal! NF AED1-Aula 01 Revisão - Alocação Dinâmica Protótipos de Funções Escopo de Variáveis Variáveis Locais Variáveis Globais Parâmetros Formais Passagem de Parâmetros por Valor Passagem de Parâmetros por Referência Passagem de Vetores e Matrizes Passagem de argumentos por valor e por referência Vetores em funções
Compartilhar