passagem de parâmetros e ponteiros
DESCRIPTION
Passagem de parâmetros e Ponteiros. Leandro Almeida [email protected]. 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. - PowerPoint PPT PresentationTRANSCRIPT
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
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:
Passagem de parâmetro por valor
Introdução a Ponteiro
Organizacao da memória (variável inteira)
Memória
int x; 0000000
(0xFF02)x
Organizacao da memória (variável inteira)
Memória
int x;x = 5;
5
(0xFF02)x
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:
Ponteiros (apontadores)
0x3287ABx
40x3287AB
x
Sintaxe: ◦ Variáveis que são ponteiros são representadas da
seguinte forma: tipo *nome_variavel;◦ Exemplo:
Ponteiros (apontadores)
NULLxint *x;
Sintaxe: ◦ Variáveis que são ponteiros são representadas da
seguinte forma: tipo *nome_variavel;◦ Exemplo:
Ponteiros (apontadores)
NULLxint *x;int y = 5;
5(0xAD036)y
Sintaxe: ◦ Variáveis que são ponteiros são representadas da
seguinte forma: tipo *nome_variavel;◦ Exemplo:
Ponteiros (apontadores)
0xAD036xint *x;int y = 5;x = &y; 5(0xAD036)y
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;
Trabalhando com ponteiros
NULL(0x3847CD)xint *x;
int *x;printf(“Endereco da variavel x: %d”,&x);printf(“Endereco guardado em x: %d”,x);
if (x != NULL) { ...}
Atribuição de ponteiros.◦ Só podemos jogar dentro do ponteiro um
endereço;
*x – representa o conteúdo final do ponteiro;
Trabalhando com ponteiros
0x32496(0x3847CD)xint *x;int y = 35;x = &y;
int *x;printf(“Conteudo final de x: %d”,*x);*x = 28;printf(“Conteudo final de x: %d”,*x);
35(0x32496)y
O que acontece no seguinte programa?
Trabalhando com ponteiros
#include <stdio.h>#include <conio.h>
main(){ 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("\n\nAlterando o valor armazenado na variavel x\n"); *x = *x + 1; printf("\nNovo 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);
getche(); }
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:
Passagem de parâmetro por referência
Passagem de parâmetro por referência
Passagem de parâmetro por referência
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.
Ponteiros com registros
#include <stdio.h>
#include <conio.h>
typedef struct
{
char modelo[30];
float potenciaMotor;
int anoFabricacao,
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);
}
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();
}
Exercício da aula anterior
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct {
char Rua[100], Bairro [20], Cidade [20];
int num, cep;
} tipo_endereco;
typedef struct { int mat, serie, irmao;
char nome[20];
float mens;
tipo_endereco ender;
} tipo_aluno;
int preencher(tipo_aluno A[20])
{
int qa, 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;
}
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));
return qa;
}
void relatorio_geral(tipo_aluno v_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(){
int qa;
tipo_aluno alunos[20];
qa=preencher(alunos);
relatorio_geral(alunos,qa);
printf("\nTecle enter para sair...");
getche();
}
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: void maximoMinimo(int v[], 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 também o main para usar essas funções.
Exercício
#include <stdio.h>
#include <math.h>
void ordena_crescente (int vet[], int tam)
{
register int i, j; // indexadores.
int aux; // variavel auxiliar.
for (i = 0; i < (tam - 1); i++)
for (j = i + 1; j < tam; j++)
if (vet[i] > vet[j])
{
aux = vet[i];
vet[i] = vet[j];
vet[j] = aux;
}
}
void maximoMinimo(int v[], int N, int *maximo, int *minimo)
{
int i;
*maximo = v[0];
*minimo = v[0];
for (i=1; i<N; i++)
{
if(v[i]>*maximo)
*maximo = v[i];
if(v[i<*minimo])
*minimo=v[i];
}
}
void info(int v[], int N, float *media, int *mediana, float *dpadrao)
{
int i, soma=0;
float vdev=0;
for(i=0; i<N; i++)
soma+=v[i];
*media = (float)soma/N;
ordena_crescente(v,N);
*mediana = v[N/2];
soma=0;
for(i=0; i<N; i++)
vdev+=(v[i]-(*media))*(v[i]-(*media));
*dpadrao = sqrt(vdev/N);
}
main()
{
int vetor[100], vmediana, vmax, vmin, tam, i;
float desvio, vmedia;
do{
printf("\nDigite o tamanho do vetor: ");
scanf("%d",&tam);
}while(tam<2 || tam>100);
for(i=0; i<tam; i++)
{
printf("\nDigite o valor da pos. %d:", i+1);
scanf("%d",&vetor[i]);
}
maximoMinimo(vetor,tam,&vmax,&vmin);
printf("\nO maximo eh: %d \nO valor minimo eh: %d", vmax, vmin);
info(vetor,tam,&vmedia,&vmediana,&desvio);
printf("\nMedia do vetor: %f", vmedia);
printf("\nMediana do vetor: %d", vmediana);
printf("\nDesvio padrao do vetor: %f", desvio);
}