Passagem de parmetros e Ponteiros Leandro Almeida lma

  • Slides: 33
Download presentation
Passagem de parâmetros e Ponteiros Leandro Almeida lma 3@cin. ufpe. br

Passagem de parâmetros e Ponteiros Leandro Almeida lma 3@cin. ufpe. br

Parâmetros são utilizados em computação para possibilitar a construção de subprogramas genéricos.

Parâmetros são utilizados em computação para possibilitar a construção de subprogramas genéricos.

Parâmetros Formais ◦ Parâmetros formais são as variáveis declaradas no cabeçalho do subprograma. 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

Parâmetros Exemplo: Parâmetros Formais Parâmetros Reais

Passagem de parâmetro por valor

Passagem de parâmetro por valor

Passagem de parâmetro por valor No instante da chamada do subprograma, o parâmetro formal

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 Exemplo:

Introdução a Ponteiro

Introdução a Ponteiro

Memória Organizacao da memória (variável inteira) int x; (0 x. FF 02)x 0000000

Memória Organizacao da memória (variável inteira) int x; (0 x. FF 02)x 0000000

Memória Organizacao da memória (variável inteira) int x; x = 5; (0 x. FF

Memória Organizacao da memória (variável inteira) int x; x = 5; (0 x. FF 02)x 5

Ponteiros (apontadores) Ponteiros (ou apontadores) são variáveis que, ao invés de guardar um dado

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; x 0 x 3287 AB Exemplo: Abstração: 0 x 3287 AB x 4

Ponteiros (apontadores) Sintaxe: ◦ Variáveis que são ponteiros são representadas da seguinte forma: tipo

Ponteiros (apontadores) Sintaxe: ◦ Variáveis que são ponteiros são representadas da seguinte forma: tipo *nome_variavel; ◦ Exemplo: int *x; x NULL

Ponteiros (apontadores) Sintaxe: ◦ Variáveis que são ponteiros são representadas da seguinte forma: tipo

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 (0 x. AD 036)y NULL 5

Ponteiros (apontadores) Sintaxe: ◦ Variáveis que são ponteiros são representadas da seguinte forma: tipo

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 (0 x. AD 036)y 0 x. AD 036 5

Trabalhando com ponteiros Toda declaração de ponteiros, inicia o ponteiro com o valor default

Trabalhando com ponteiros Toda declaração de ponteiros, inicia o ponteiro com o valor default NULL; int *x; (0 x 3847 CD)x NULL É sempre bom testar se o ponteiro não é NULL antes de acessá-lo; if (x != NULL) {. . . } x – representa o endereço armazenado no ponteiro; 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

Trabalhando com ponteiros Atribuição de ponteiros. ◦ Só podemos jogar dentro do ponteiro um endereço; int *x; int y = 35; x = &y; (0 x 3847 CD)x (0 x 32496)y 0 x 32496 35 *x – representa o conteúdo final do ponteiro; 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? #include <stdio. h> #include <conio.

Trabalhando com ponteiros O que acontece no seguinte programa? #include <stdio. h> #include <conio. h> main() { int y = 5; int *x; x = &y; printf("Valor armazenado na variavel y: %dn", y); printf("Endereco de y: %dn", &y); printf("Valor do conteudo do ponteiro x: %dn", *x); printf("Valor do endereco armazenado no ponteiro x: %dn", x); printf("Valor do endereco de x: %dn", &x); printf("nn. Alterando o valor armazenado na variavel xn"); *x = *x + 1; printf("n. Novo valor do conteudo do ponteiro x: %dn", *x); printf("Valor do endereco armazenado no ponteiro x: %dn", x); printf("Valor via y: %dn", y); getche(); }

Passagem de parâmetro por referência

Passagem de parâmetro por referência

Passagem de parâmetro por referência Caracteriza-se por ser um mecanismo de comunicação bidirecional com

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

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

Passagem de parâmetro por referência

Ponteiros com registros Crie um programa na linguagem C que define a estrutura de

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.

#include <stdio. h> #include <conio. h> typedef struct { char modelo[30]; float potencia. Motor;

#include <stdio. h> #include <conio. h> typedef struct { char modelo[30]; float potencia. Motor; int ano. Fabricacao, num. Portas; }CARRO; void Exibe(CARRO car) { printf("nt. Exibindo carron"); printf("Modelo: %sn", car. modelo); printf("Motor: %. 1 fn", car. potencia. Motor); printf("Ano: %dn", car. ano. Fabricacao); printf("%d portasn", car. num. Portas); } void Preenche(CARRO *car) { printf("Modelo do carro: "); gets( car->modelo ); printf("Motor: "); scanf("%f", &car->potencia. Motor); printf("Ano: "); scanf("%d", &car->ano. Fabricacao); } printf("Numero de portas: "); scanf("%d", &car->num. Portas); main(void) { CARRO fusca; Preenche(&fusca); Exibe(fusca); } getche();

Exercício da aula anterior

Exercício da aula anterior

#include <stdio. h> #include <stdlib. h> #include <conio. h> typedef struct { char Rua[100],

#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; if (A[qa]. irmao ==

int preencher(tipo_aluno A[20]) { int qa, i, resp; qa =0; 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: "); do{ printf("Colegio Legaln"); printf("nn. Cadastro de Alunosnn"); printf("n. Matricula. : "); scanf("%d", &A[qa]. mat); printf("n. Nome. . . : "); fflush(stdin); gets(A[qa]. nome); printf("n. Serie(1 -4): "); scanf("%d", &A[qa]. serie); printf("n. Irmao na escola(1 -sim/0 -nao): "); scanf("%d", &A[qa]. irmao); switch(A[qa]. serie){ scanf("%d", &A[qa]. ender. cep); case 1: A[qa]. mens = 110; break; qa++; case 2: A[qa]. mens = 130; break; printf("nn. Deseja cadastrar outro aluno(1 -sim/0 -nao)? "); case 3: A[qa]. mens = 160; break; scanf("%d", &resp); case 4: A[qa]. mens = 170; break; } }while ((resp == 1) && (qa <20)); return qa; }

void relatorio_geral(tipo_aluno v_alunos[20], int q ) { int j; printf("Colegio Legaln"); printf("nn. Relatorio Geraln");

void relatorio_geral(tipo_aluno v_alunos[20], int q ) { int j; printf("Colegio Legaln"); printf("nn. Relatorio Geraln"); printf("n________________"); printf("n. Mat. t. Nomet. Seriet. Irmaot. Mens. t. Ruat. Bairrot. Cidadet. Numerot. Cep"); printf("n________________"); for(j = 0; j < q; j++) { printf("n %5 d %-10 s %5 d %5. 2 f %-10 s %5 d ", 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_alunos[20]; qa=preencher(alunos); relatorio_geral(alunos, qa); printf("n. Tecle enter para sair. . .

main(){ int qa; tipo_alunos[20]; qa=preencher(alunos); relatorio_geral(alunos, qa); printf("n. Tecle enter para sair. . . "); getche(); }

Exercício Escreva um programa que: ◦ Possua uma função que recebe como parâmetros um

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: void maximo. Minimo(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.

#include <stdio. h> #include <math. h> void info(int v[], int N, float *media, int

#include <stdio. h> #include <math. h> void info(int v[], int N, float *media, int *mediana, float *dpadrao) void ordena_crescente (int vet[], int tam) { { int i, soma=0; register int i, j; // indexadores. int aux; float vdev=0; // variavel auxiliar. for(i=0; i<N; i++) for (i = 0; i < (tam - 1); i++) soma+=v[i]; for (j = i + 1; j < tam; j++) if (vet[i] > vet[j]) *media = (float)soma/N; { aux = vet[i]; ordena_crescente(v, N); vet[i] = vet[j]; vet[j] = aux; *mediana = v[N/2]; } } soma=0; void maximo. Minimo(int v[], int N, int *maximo, int *minimo) for(i=0; i<N; i++) { vdev+=(v[i]-(*media))*(v[i]-(*media)); int i; *maximo = v[0]; *dpadrao = sqrt(vdev/N); *minimo = v[0]; for (i=1; i<N; i++) { if(v[i]>*maximo) *maximo = v[i]; if(v[i<*minimo]) *minimo=v[i]; } } }

main() { int vetor[100], vmediana, vmax, vmin, tam, i; float desvio, vmedia; do{ printf("n.

main() { int vetor[100], vmediana, vmax, vmin, tam, i; float desvio, vmedia; do{ printf("n. Digite o tamanho do vetor: "); scanf("%d", &tam); }while(tam<2 || tam>100); for(i=0; i<tam; i++) { printf("n. Digite o valor da pos. %d: ", i+1); scanf("%d", &vetor[i]); } maximo. Minimo(vetor, tam, &vmax, &vmin); printf("n. O maximo eh: %d n. O valor minimo eh: %d", vmax, vmin); info(vetor, tam, &vmediana, &desvio); printf("n. Media do vetor: %f", vmedia); printf("n. Mediana do vetor: %d", vmediana); printf("n. Desvio padrao do vetor: %f", desvio); }