310 likes | 561 Views
Passagem de parâmetros e Ponteiros. Leandro Almeida lma3@cin.ufpe.br. Parâmetros. Parâmetros são utilizados em computação para possibilitar a construção de subprogramas genéricos. Parâmetros. Parâmetros Formais Parâmetros formais são as variáveis declaradas no cabeçalho do subprograma.
E N D
Passagem de parâmetros e Ponteiros Leandro Almeida lma3@cin.ufpe.br
Parâmetros • Parâmetros são utilizados em computação para possibilitar a construção de subprogramas genéricos.
Parâmetros • Parâmetros Formais • Parâmetros formais são as variáveis declaradas no cabeçalho do subprograma. • Parâmetros Reais • Parâmetros reais são as variáveis passadas no instante da chamada do subprograma.
Parâmetros • Exemplo: Parâmetros Formais Parâmetros Reais
Passagem de parâmetro por valor • No instante da chamada do subprograma, o parâmetro formal recebe uma cópia do valor do parâmetro real correspondente. • Alterações feitas nos parâmetros formais não refletem nos parâmetros reais correspondentes. • Caracteriza-se por ser um mecanismo de entrada de dados para o subprograma.
Passagem de parâmetro por valor • Exemplo:
Memória • Organizacao da memória (variável inteira) (0xFF02)x 0000000 int x;
Memória • Organizacao da memória (variável inteira) (0xFF02)x 5 int x; x = 5;
Ponteiros (apontadores) • Ponteiros (ou apontadores) são variáveis que, ao invés de guardar um dado (valor), guardam um endereço de memória, associada a outra variável; • Dessa forma, ponteiros fazem referência a outra variável; • Exemplo: • Abstração: x 0x3287AB 0x3287AB 4 x
Ponteiros (apontadores) • Sintaxe: • Variáveis que são ponteiros são representadas da seguinte forma: tipo *nome_variavel; • Exemplo: x int *x; NULL
Ponteiros (apontadores) • Sintaxe: • Variáveis que são ponteiros são representadas da seguinte forma: tipo *nome_variavel; • Exemplo: int *x; int y = 5; x NULL (0xAD036)y 5
Ponteiros (apontadores) • Sintaxe: • Variáveis que são ponteiros são representadas da seguinte forma: tipo *nome_variavel; • Exemplo: int *x; int y = 5; x = &y; x 0xAD036 (0xAD036)y 5
Trabalhando com ponteiros • Toda declaração de ponteiros, inicia o ponteiro com o valor default NULL; • É sempre bom testar se o ponteiro não é NULL antes de acessá-lo; • x – representa o endereço armazenado no ponteiro; (0x3847CD)x int *x; NULL if (x != NULL) { ... } int *x; printf(“Endereco da variavel x: %d”,&x); printf(“Endereco guardado em x: %d”,x);
Trabalhando com ponteiros • Atribuição de ponteiros. • Só podemos jogar dentro do ponteiro um endereço; • *x – representa o conteúdo final do ponteiro; (0x3847CD)x int *x; int y = 35; x = &y; 0x32496 (0x32496)y 35 int *x; printf(“Conteudo final de x: %d”,*x); *x = 28; printf(“Conteudo final de x: %d”,*x);
Trabalhando com ponteiros • O que acontece no seguinte programa? int y = 5; int *x; x = &y; printf("Valor armazenado na variavel y: %d\n", y); printf("Endereco de y: %d\n",&y); printf("Valor do conteudo do ponteiro x: %d\n",*x); printf("Valor do endereco armazenado no ponteiro x: %d\n", x); printf("Valor do endereco de x: %d\n",&x); printf("Alterando o valor armazenado na variavel x\n"); *x = *x + 1; printf("Novo valor do conteudo do ponteiro x: %d\n",*x); printf("Valor do endereco armazenado no ponteiro x: %d\n", x); printf("Valor via y: %d\n",y);
Passagem de parâmetro por referência • Caracteriza-se por ser um mecanismo de comunicação bidirecional com o subprograma, ou seja, é um mecanismo de entrada e saída de dados. • Qualquer modificação feita em um parâmetro formal implica em alteração no parâmetro real correspondente.
Passagem de parâmetro por referência • Na passagem por referência utiliza-se um tipo de dados especial chamado ponteiro, que representa o endereço da variável passada por parâmetro. Representado pelo * após o tipo da variável e antes do seu nome. • Exemplo:
Ponteiros com registros • Crie um programa na linguagem C que define a estrutura de um carro, altere seus dados através de uma função (use passagem por referência e o operador ->) bem como use outra função para exibir os membros da struct.
void Preenche(CARRO *car) { printf("Modelo do carro: "); gets( car->modelo ); printf("Motor: "); scanf("%f", &car->potenciaMotor); printf("Ano: "); scanf("%d", &car->anoFabricacao); printf("Numero de portas: "); scanf("%d", &car->numPortas); } main(void) { CARRO fusca; Preenche(&fusca); Exibe(fusca); getche(); } #include <stdio.h> #include <conio.h> typedefstruct { char modelo[30]; floatpotenciaMotor; intanoFabricacao, numPortas; }CARRO; void Exibe(CARRO car) { printf("\n\tExibindo carro\n"); printf("Modelo: %s\n", car.modelo); printf("Motor: %.1f\n", car.potenciaMotor); printf("Ano: %dn", car.anoFabricacao); printf("%d portas\n", car.numPortas); }
#include <stdio.h> #include <stdlib.h> #include <conio.h> typedefstruct { char Rua[100], Bairro [20], Cidade [20]; int num, cep; } tipo_endereco; typedefstruct { intmat, serie, irmao; char nome[20]; float mens; tipo_enderecoender; } tipo_aluno;
if (A[qa].irmao == 1) A[qa].mens = A[qa].mens*0.8; printf("\n digite o endereco: "); printf("\n Rua : "); fflush(stdin); gets(A[qa].ender.Rua); printf("\n Bairro: "); fflush(stdin); gets(A[qa].ender.Bairro); printf("\n Cidade : "); fflush(stdin); gets(A[qa].ender.Cidade); printf("\n numero: "); ; scanf("%d",&A[qa].ender.num); printf("\n cep: "); scanf("%d",&A[qa].ender.cep); qa++; printf("\n\nDeseja cadastrar outro aluno(1-sim/0-nao)? "); scanf("%d",&resp); }while ((resp == 1) && (qa <20)); returnqa; } int preencher(tipo_aluno A[20]) { intqa, i, resp; qa =0; do{ printf("Colegio Legal\n"); printf("\n\nCadastro de Alunos\n\n"); printf("\nMatricula.: "); scanf("%d",&A[qa].mat); printf("\nNome......: "); fflush(stdin); gets(A[qa].nome); printf("\nSerie(1-4): "); scanf("%d",&A[qa].serie); printf("\nIrmao na escola(1-sim/0-nao):"); scanf("%d",&A[qa].irmao); switch(A[qa].serie){ case 1: A[qa].mens = 110; break; case 2: A[qa].mens = 130; break; case 3: A[qa].mens = 160; break; case 4: A[qa].mens = 170; break; }
voidrelatorio_geral(tipo_alunov_alunos[20],int q ) { int j; printf("Colegio Legal\n"); printf("\n\nRelatorio Geral\n"); printf("\n________________________________"); printf("\nMat.\tNome\tSerie\tIrmao\tMens.\tRua\tBairro\tCidade\tNumero\tCep"); printf("\n________________________________"); for(j = 0; j < q; j++) { printf("\n %5d %-10s %5d %5d %5.2f %-10s %-10s %-10s %5d %5d ", v_alunos[j].mat, v_alunos[j].nome, v_alunos[j].serie, v_alunos[j].irmao, v_alunos[j].mens, v_alunos[j].ender.Rua, v_alunos[j].ender.Bairro, v_alunos[j].ender.Cidade, v_alunos[j].ender.num, v_alunos[j].ender.cep); printf("\n_______________________________"); } }
main(){ intqa; tipo_aluno alunos[20]; qa=preencher(alunos); relatorio_geral(alunos,qa); printf("\nTecleenter para sair..."); getche(); }
Exercício • Escreva um programa que: • Possua uma função que recebe como parâmetros um vetor de inteiros v, o número de elementos dele N e ponteiros para variáveis nas quais devem ser armazenados os valores maximo e minimo do vetor. Sua assinatura deve ser: • voidmaximoMinimo(intv[], int N, int *maximo, int *minimo); • Outra função que retorne via ponteiros a média, mediana e desvio padrão do vetor passado como parâmetro. • Escreva o main para usar essas funções.