FUNDAMENTO DE PROGRAMAÇÃO LINGUAGEM C – PONTEIROS PARTE 2
Ponteiros como Argumento de Funções Ponteiros para Funções Exercícios SUMÁRIO Ponteiros como Argumento de Funções Ponteiros para Funções Exercícios
PONTEIROS COMO PARÂMETROS DE FUNÇÕES
PONTEIROS COMO PARÂMETROS DE FUNÇÕES Em C, uma função A não pode alterar diretamente valores de variáveis da função B que fez a chamada da função A. Em outras palavras, uma função não pode alterar as variáveis de outro escopo local que não seja o seu.
PONTEIROS COMO PARÂMETROS DE FUNÇÕES Por exemplo: Escreva um programa que permute os valores de duas variáveis utilizando apenas atribuições entre elas.
PONTEIROS COMO PARÂMETROS DE FUNÇÕES Solução: 01. int temp,x=10,y=5; 02. temp = x; 03. x = y; 04. y = temp;
PONTEIROS COMO PARÂMETROS DE FUNÇÕES E se o problema fosse: Escreva uma função apta a permutar os valores de duas variáveis da função main utilizando apenas atribuições entre elas.
PONTEIROS COMO PARÂMETROS DE FUNÇÕES Possível Solução (main): int main ( void ){ 01. int a = 5, b = 7; 02. troca(a, b); 03. printf("%i %i \n", a, b); 04. return 0; }
PONTEIROS COMO PARÂMETROS DE FUNÇÕES Possível Solução (função requerida): void troca (int x, int y ){ 01. int temp; 02. temp = x; 03. x = y; 04. y = temp; }
PONTEIROS COMO PARÂMETROS DE FUNÇÕES Possível Solução (função requerida): void troca (int x, int y ){ 01. int temp; 02. temp = x; 03. x = y; 04. y = temp; } Repare que está função não atende ao problema pois os valores de a e b na função main permanecem inalterados.
PONTEIROS COMO PARÂMETROS DE FUNÇÕES A solução para este problema consiste no uso de ponteiros, onde: Passamos para a função troca os endereços de memória onde as variáveis a e b estão armazenadas; E assim a função troca poderá alterar, indiretamente, os conteúdos (valores) das variáveis locais a e b da função main.
PONTEIROS COMO PARÂMETROS DE FUNÇÕES Seguindo este raciocínio, a função troca é reescrita como: void troca (int *px, int *py ){ 01. int temp; 02. temp = *px; 03. *px = *py; 04. *py = temp; }
PONTEIROS COMO PARÂMETROS DE FUNÇÕES void troca (int *px, int *py ){ 01. int temp; //* = “contéudo de” 02.temp = *px; 03.*px = *py; 04.*py = temp; /*Nesta função, os valores serão passados por referência.*/ } Como pode ser visto, agora a função troca receba os endereços das variáveis e, assim, alterar seus valores indiretamente.
PONTEIROS COMO PARÂMETROS DE FUNÇÕES Solução correta: void troca (int *px, int *py ){ int temp; temp = *px; *px = *py; *py = temp; } void main ( void ) { int a = 5, b = 7; troca(&a, &b); /* passamos os endereços das variáveis */ printf("%d %d \n", a, b);
PONTEIROS COMO PARÂMETROS DE FUNÇÕES Pilha de Execução do Programa:
PONTEIROS COMO PARÂMETROS DE FUNÇÕES Pilha de Execução do Programa:
PONTEIROS COMO PARÂMETROS DE FUNÇÕES Pilha de Execução do Programa:
PONTEIROS PARA FUNÇÕES
PONTEIROS PARA FUNÇÕES Em C, ponteiros para funções servem, normalmente, para passar uma função como argumento de uma outra função. A forma geral para declarar um ponteiro para uma função é: tipo_retorno (*nome_do_ponteiro) (lista de tipos de parâmetros)
PONTEIROS PARA FUNÇÕES Exemplo: int soma(int a, int b) { return a + b; } int operacao(int x, int y, int (*func)(int,int)) { int g; g = (*func)(x, y); return g;
PONTEIROS PARA FUNÇÕES Exemplo: void main () { int m; m = operacao(7, 5, soma); printf("%i\n", m); }
Exercícios
PONTEIROS PARA FUNÇÕES Desenhe a pilha de execução do programa a seguir: void main(){ int x = 10; int *p_x = &x; int **p_p_x = &p_x; printf("%d\n", x); printf("%d\n", *p_x); printf("%d\n", **p_p_x); }
PONTEIROS PARA FUNÇÕES Depure o programa a seguir e desenhe sua pilha de execução: void main(){ int *a, *b, c = 4, d = 2; a = &c; b = &d; *b = 8; *a = *b; *a = 1; b = a; *b = 0; }
PONTEIROS PARA FUNÇÕES Depure o programa a seguir e desenhe sua pilha de execução: void main(){ int *a, *b, c = 8, d = 2; a = &c; b = &d; *a = 5; (*a)+=10; *b = *a; }
PONTEIROS PARA FUNÇÕES Depure o programa a seguir e desenhe sua pilha de execução: void main(){ int *a, *b, *c, d = 12, e = 4, f=0; a = &d; b = &e; c = &f; *a = 5; *c = 1; ++*c; (*a)+=10; *b = *a; c = b; *a = 25; *c = 3; }
PONTEIROS PARA FUNÇÕES Escreva uma função apta a permutar os valores de duas variáveis locais da função main utilizando para isso apenas atribuições entre estas variáveis.
PONTEIROS PARA FUNÇÕES Escreva um programa em C para ler 2 números e ao final, caso o usuário selecione a opção 1, o programa imprimi a tabuada de multiplicação do produto dos dois números, e caso usuário selecione a opção 2, o programa imprimi o maior dos dois e informa se é par,impar,positivo, negativo. Observações: Não deve ser aceito zero para os dois valores informados; O programa deve conter uma função a parte para: tabuada; par/impar;positivo/negativo; Estas funções devem ser ativadas por meio de ponteiros.