Buscar

AED1 01 Revisao

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

Continue navegando