profs.:

48
[email protected] DSC/CCT/UFCG Profs .: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel Carga Horária: 60 h

Upload: huyen

Post on 07-Jan-2016

40 views

Category:

Documents


0 download

DESCRIPTION

Profs.:. José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel. Carga Horária:. 60 h. Introdução à Programação. Capítulo 7. Apontadores. Introdução à Programação. Tópicos 7.1Introdução 7.2Declaração e Inicialização de Variáveis para Apontamento - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Profs.:

ran

gel@

dsc.u

fpb

.br

DSC/CCT/UFCGDSC/CCT/UFCG

Profs.:Profs.: José Eustáquio Rangel de QueirozRoberto Medeiros de Faria

Ulrich Schiel

José Eustáquio Rangel de QueirozRoberto Medeiros de Faria

Ulrich Schiel

Carga Horária:Carga Horária: 60 h60 h

Page 2: Profs.:

22

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Tópicos

7.1 Introdução

7.2 Declaração e Inicialização de Variáveis para Apontamento

7.3 Operadores de Apontadores

7.4 Chamada de Funções por Referência

7.5 Uso do Qualificador const com Apontadores

7.6 Ordenação Borbulhante (Bubble Sort) Usando Chamada por Referência

7.7 Expressões e Aritmética de Apontadores

Tópicos

7.1 Introdução

7.2 Declaração e Inicialização de Variáveis para Apontamento

7.3 Operadores de Apontadores

7.4 Chamada de Funções por Referência

7.5 Uso do Qualificador const com Apontadores

7.6 Ordenação Borbulhante (Bubble Sort) Usando Chamada por Referência

7.7 Expressões e Aritmética de Apontadores

Introdução à ProgramaçãoIntrodução à Programação

Page 3: Profs.:

33

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Tópicos

7.8 Relação entre Apontadores e Arrays

7.9 Arrays de Apontadores

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

7.11 Apontadores para Funções

Tópicos

7.8 Relação entre Apontadores e Arrays

7.9 Arrays de Apontadores

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

7.11 Apontadores para Funções

Introdução à ProgramaçãoIntrodução à Programação

Page 4: Profs.:

44

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.1 Introdução7.1 Introdução

Apontadores

Poderosos, apesar de difícil domínio

Simulação de chamadas por referência

Relação íntima com arrays e cadeias de caracteres (strings)

Apontadores

Poderosos, apesar de difícil domínio

Simulação de chamadas por referência

Relação íntima com arrays e cadeias de caracteres (strings)

Page 5: Profs.:

55

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.2 Declaração e Inicialização de Variáveis para Apontamento

7.2 Declaração e Inicialização de Variáveis para Apontamento

Variáveis para Apontamento Contêm endereços de memória como valores

Variáveis normais contêm valores específicos (referência direta)

Apontadores contêm endereços de variáveis que contêm valores específicos (referência indireta)

Indirection referenciação de um valor via apontador

Variáveis para Apontamento Contêm endereços de memória como valores

Variáveis normais contêm valores específicos (referência direta)

Apontadores contêm endereços de variáveis que contêm valores específicos (referência indireta)

Indirection referenciação de um valor via apontador

 

contadorcontador

77

contadorcontador

77

Apontador para contador

Apontador para contador

Page 6: Profs.:

66

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Declaração de Apontadores

* Usado com variáveis de apontamento

int *apont;

Declaração de um apontador para um int (apontador do tipo int *)

Apontadores múltiplos requerem o uso de um * antes de cada declaração de variável

int *apont1, *apont2;

Declaração de Apontadores

* Usado com variáveis de apontamento

int *apont;

Declaração de um apontador para um int (apontador do tipo int *)

Apontadores múltiplos requerem o uso de um * antes de cada declaração de variável

int *apont1, *apont2;

7.2 Declaração e Inicialização de Variáveis para Apontamento

7.2 Declaração e Inicialização de Variáveis para Apontamento

Page 7: Profs.:

77

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Declaração de Apontadores

Possibilidade de declaração de apontadores qualquer tipo de dados

Inicialização de apontadores para 0, NULL ou um endereço

0 ou NULL apontadores para nada (NULL preferencialmente)

Declaração de Apontadores

Possibilidade de declaração de apontadores qualquer tipo de dados

Inicialização de apontadores para 0, NULL ou um endereço

0 ou NULL apontadores para nada (NULL preferencialmente)

7.2 Declaração e Inicialização de Variáveis para Apontamento

7.2 Declaração e Inicialização de Variáveis para Apontamento

Page 8: Profs.:

88

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.3 Operadores de Apontamento 7.3 Operadores de Apontamento

& (Operador de endereçamento) Retorna o endereço de um operando

int y = 5;int *apont_y; apont_y = &y; // apont_y contém o endereço de yapont_y “aponta para” y

& (Operador de endereçamento) Retorna o endereço de um operando

int y = 5;int *apont_y; apont_y = &y; // apont_y contém o endereço de yapont_y “aponta para” y

Apont_yApont_y yy

Apont_Apont_yy

500000

O endereço de yy é o valor de apont_yapont_y

O endereço de yy é o valor de apont_yapont_y

55

600000600000 600000

55

yy

Page 9: Profs.:

99

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

* (Operador de indirection/dereferencing)

Retorna uma cópia do conteúdo da locação para a qual o operando aponta

*apont_y retorna y (visto que apont_y aponta para y)

* pode ser usado para atribuição

Retorna cópia para um objeto

*apont_y = 7; // altera o valor de y para 7

* (Operador de indirection/dereferencing)

Retorna uma cópia do conteúdo da locação para a qual o operando aponta

*apont_y retorna y (visto que apont_y aponta para y)

* pode ser usado para atribuição

Retorna cópia para um objeto

*apont_y = 7; // altera o valor de y para 7

7.3 Operadores de Apontamento 7.3 Operadores de Apontamento

Page 10: Profs.:

1010

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

* (Operador de referência indireta ou de desreferência)

Operando de * deve ser um lvalue (não constante)

* e & são inversos

Um cancela o outro

* (Operador de referência indireta ou de desreferência)

Operando de * deve ser um lvalue (não constante)

* e & são inversos

Um cancela o outro

7.3 Operadores de Apontamento 7.3 Operadores de Apontamento

Page 11: Profs.:

1111

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.3 Operadores de Apontamento 7.3 Operadores de Apontamento

01 /* Uso dos operadores & e * */01 /* Uso dos operadores & e * */020203 #include <stdio.h>03 #include <stdio.h>040405 int main()05 int main()06 {06 {07 int a; /* a é um inteiro */07 int a; /* a é um inteiro */08 int *aPont; /* aPont é um apontador para um inteiro */08 int *aPont; /* aPont é um apontador para um inteiro */090910 a = 7;10 a = 7;11 aPont = &a; /* aPont aponta para o endereço de a */11 aPont = &a; /* aPont aponta para o endereço de a */121213 printf( “O endereço de a é %p”“\nO valor de aPont é %p”, &a, aPont ); 13 printf( “O endereço de a é %p”“\nO valor de aPont é %p”, &a, aPont ); 141415 printf( “\n\nO valor de a é %d” “\ nO valor de *aPont é %d”, a, *aPont );15 printf( “\n\nO valor de a é %d” “\ nO valor de *aPont é %d”, a, *aPont );161617 printf( “\n\n Prova de que * e & são complementares\n&*aPont = %p” 17 printf( “\n\n Prova de que * e & são complementares\n&*aPont = %p” 18 “\n*&aPont = %p\n”, &*aPont, *&aPont )18 “\n*&aPont = %p\n”, &*aPont, *&aPont )191920 return 0;20 return 0;21 }21 }

O endereço de aa é o valor de aPtraPtr O endereço de aa é o valor de aPtraPtr

Observar que ** e && são inversos Observar que ** e && são inversos

O operador ** retorna uma cópia para a locação para a qual seu operando aponta. aPtraPtr aponta para aa, de modo que *aPtr*aPtr retorna aa.

O operador ** retorna uma cópia para a locação para a qual seu operando aponta. aPtraPtr aponta para aa, de modo que *aPtr*aPtr retorna aa.

Page 12: Profs.:

1212

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.3 Operadores de Apontamento 7.3 Operadores de Apontamento

O endereço de a é 0012FF88O valor de aPont é 0012FF88 O valor de a é 7O valor de *aPont é 7Prova de que * e & são complementares&*aPont = 0012FF88*&aPont = 0012FF88

O endereço de a é 0012FF88O valor de aPont é 0012FF88 O valor de a é 7O valor de *aPont é 7Prova de que * e & são complementares&*aPont = 0012FF88*&aPont = 0012FF88

Saída apresentada Saída apresentada

Page 13: Profs.:

1313

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.4 Chamada de Funções por Referência

7.4 Chamada de Funções por Referência

Chamada por referência com argumentos de apontamento

Passagem do endereço do argumento via operador &&

Possibilidade de alteração da locação corrente na memória

Impossibilidade de passagem de arrays com && (o nome de um array já é um apontador)

Chamada por referência com argumentos de apontamento

Passagem do endereço do argumento via operador &&

Possibilidade de alteração da locação corrente na memória

Impossibilidade de passagem de arrays com && (o nome de um array já é um apontador)

Page 14: Profs.:

1414

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.4 Chamada de Funções por Referência

7.4 Chamada de Funções por Referência

Operador * Uso como cópia/“apelido” da variável interna à

função

void double(int *num) {

*num = 2*(*num); }

Uso de *num como “apelido” da variável passada

Operador * Uso como cópia/“apelido” da variável interna à

função

void double(int *num) {

*num = 2*(*num); }

Uso de *num como “apelido” da variável passada

Page 15: Profs.:

1515

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.4 Chamada de Funções por Referência

7.4 Chamada de Funções por Referência

01 /* Uso de chamada por referência para cálculo do cubo de uma variável com um argumento apontador */

0203 #include <stdio.h>0405 void cuboPorReferenciacuboPorReferencia( int * ); /* protótipo */0607 int main()08 {09 int numero = 5;1011 printf( “O valor original do número é %d", numero );12 cuboPorReferencia( &numero );13 printf( "\nO novo valor de número é %d\n", numero );1415 return 0;16 }1718 void cuboPorReferenciacuboPorReferencia( int *nPtr )19 {20 *nPtr = *nPtr * *nPtr * *nPtr; /* cubo de numero em main */21 }

O endereço de um número é dado - cuboPorReferenciacuboPorReferencia espera um apontador (o endereço de uma variável)

O endereço de um número é dado - cuboPorReferenciacuboPorReferencia espera um apontador (o endereço de uma variável)

O protótipo da função inclui um apontador para um inteiro (int *int *)

O protótipo da função inclui um apontador para um inteiro (int *int *)

*nPtr*nPtr é usado em cuboPorReferenciacuboPorReferencia (*nPtr*nPtr é um número)

*nPtr*nPtr é usado em cuboPorReferenciacuboPorReferencia (*nPtr*nPtr é um número)

Page 16: Profs.:

1616

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.5 Uso do Qualificador const com Apontadores

7.5 Uso do Qualificador const com Apontadores

Qualificador const

Variável não pode ser alterada

Uso de const se a função não precisar alterar uma variável

Tentativa de alteração de uma variável const produz um erro

Qualificador const

Variável não pode ser alterada

Uso de const se a função não precisar alterar uma variável

Tentativa de alteração de uma variável const produz um erro

Page 17: Profs.:

1717

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.5 Uso do Qualificador const com Apontadores

7.5 Uso do Qualificador const com Apontadores

Apontadores const Apontamento para uma locação de memória

constante Initialização obrigatória no ato da declaração int *const Apont = &x;

Tipo int *const Apontador constante para um int

const int * Apont = &x;Apontador regular para um const int

const int *const Apont = &x;Apontador const para um const intPossibilidade de alteração de x, mas não de * Apont

Apontadores const Apontamento para uma locação de memória

constante Initialização obrigatória no ato da declaração int *const Apont = &x;

Tipo int *const Apontador constante para um int

const int * Apont = &x;Apontador regular para um const int

const int *const Apont = &x;Apontador const para um const intPossibilidade de alteração de x, mas não de * Apont

Page 18: Profs.:

1818

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

01 /*Tentativa de modificação de um apontador constante para dados não constantes*/02

0304 #include <stdio.h>0506 int main()07 {08 int x, y;09 int * const ptr = &x; /* ptr é um apontador constante para um

11 aponte sempre para a mesma locação de memória. */12 *ptr = 7;13 ptr = &y;14 return 0;15 }

10 inteiro, passível de modificação através de apont, embora este

7.5 Uso do Qualificador const com Apontadores

7.5 Uso do Qualificador const com Apontadores

A alteração de ptrptr é um erro, uma vez que se trata de um apontador constante

A alteração de ptrptr é um erro, uma vez que se trata de um apontador constante

A alteração de *ptr*ptr é correto, uma vez que xx não é constante

A alteração de *ptr*ptr é correto, uma vez que xx não é constante

Error E2024 FIG07_13.c 16: Cannot modify a const object in functionmain*** 1 errors in Compile ***

Error E2024 FIG07_13.c 16: Cannot modify a const object in functionmain*** 1 errors in Compile ***

Page 19: Profs.:

1919

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.6 Ordenação Borbulhante (Bubble Sort)

Usando Chamada por Referência

7.6 Ordenação Borbulhante (Bubble Sort)

Usando Chamada por Referência

Implementação da ordenação borbulhante usando apontadores Varredura de dois elementos

Passagem de endereços (uso de &) de elementos do array para a função permuta

Array elements have call-by-value default

Uso de apontadores e do operador * para o chaveamento de elementos do array pela função permuta

Implementação da ordenação borbulhante usando apontadores Varredura de dois elementos

Passagem de endereços (uso de &) de elementos do array para a função permuta

Array elements have call-by-value default

Uso de apontadores e do operador * para o chaveamento de elementos do array pela função permuta

Page 20: Profs.:

2020

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.6 Ordenação Borbulhante (Bubble Sort)

Usando Chamada por Referência

7.6 Ordenação Borbulhante (Bubble Sort)

Usando Chamada por Referência

Pseudo-código

Inicializar array

Imprimir os dados na ordem original

Chamar a função de ordenação borbulhante (bubblesort)

Imprimir o array produzido pela ação da função

Definir ordenação borbulhante (bubblesort)

Definir função permuta

Pseudo-código

Inicializar array

Imprimir os dados na ordem original

Chamar a função de ordenação borbulhante (bubblesort)

Imprimir o array produzido pela ação da função

Definir ordenação borbulhante (bubblesort)

Definir função permuta

Page 21: Profs.:

2121

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

01 /*Programa que organiza valores de um array em ordem crescente, imprimindo o01 /*Programa que organiza valores de um array em ordem crescente, imprimindo o

03 #include <stdio.h>03 #include <stdio.h>04 #define TAMANHO 1004 #define TAMANHO 1005 void borbulha( int *, const int );05 void borbulha( int *, const int );060607 int main()07 int main()08 {08 {09 int a[TAMANHO] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };09 int a[TAMANHO] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };10 int i;10 int i;11 printf( “Dados na ordem original \n" );11 printf( “Dados na ordem original \n" );12 for ( i = 0; i < TAMANHO ; i++ )12 for ( i = 0; i < TAMANHO ; i++ )13 printf( "%4d", a[ i ] );13 printf( "%4d", a[ i ] );14 borbulha( a, TAMANHO ); /* ordena e apresenta o array */14 borbulha( a, TAMANHO ); /* ordena e apresenta o array */15 printf( "\nDados em ordem crescente\n" );15 printf( "\nDados em ordem crescente\n" );16 for ( i = 0; i < TAMANHO ; i++ )16 for ( i = 0; i < TAMANHO ; i++ )17 printf( "%4d", a[ i ] ); 17 printf( "%4d", a[ i ] ); 18 printf( "\n" );18 printf( "\n" );19 return 0;19 return 0;20 }20 }

02 resultado*/02 resultado*/

7.5 Uso do Qualificador const com Apontadores

7.5 Uso do Qualificador const com Apontadores

borbulhaborbulha recebe endereços de elementos do array (uso de apontadores). O nome de um array é um apontador.

borbulhaborbulha recebe endereços de elementos do array (uso de apontadores). O nome de um array é um apontador.

Page 22: Profs.:

2222

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.5 Uso do Qualificador const com Apontadores

7.5 Uso do Qualificador const com Apontadores

21 /*Função que varre um array, organizando seus elementos em ordem crescente21 /*Função que varre um array, organizando seus elementos em ordem crescente22 void borbulha( int *array, const int tam )22 void borbulha( int *array, const int tam )23 {23 {24 void permuta( int *, int * );24 void permuta( int *, int * );

25 int i, j; 25 int i, j; 26 for ( i = 0; i < tam - 1; i++ )26 for ( i = 0; i < tam - 1; i++ )27 for ( j = 0; j < tam - 1; j++ )27 for ( j = 0; j < tam - 1; j++ )28 if ( array[ j ] > array[ j + 1 ] )28 if ( array[ j ] > array[ j + 1 ] )29 permuta( &array[ j ], &array[ j + 1 ] );29 permuta( &array[ j ], &array[ j + 1 ] );30 }30 }31 void permuta( int *apontelem1, int *apontelem2)31 void permuta( int *apontelem1, int *apontelem2)32 {32 {33 int auxi = *apontelem1;33 int auxi = *apontelem1;34 *apontelem1 = *apontelem2;34 *apontelem1 = *apontelem2;35 *apontelem2 = auxi;35 *apontelem2 = auxi;36 }36 }

Dados na ordem originalDados na ordem original 2 6 4 8 10 12 89 68 45 372 6 4 8 10 12 89 68 45 37Dados em ordem crescenteDados em ordem crescente 2 4 6 8 10 12 37 452 4 6 8 10 12 37 45 68 98 68 98

Dados na ordem originalDados na ordem original 2 6 4 8 10 12 89 68 45 372 6 4 8 10 12 89 68 45 37Dados em ordem crescenteDados em ordem crescente 2 4 6 8 10 12 37 452 4 6 8 10 12 37 45 68 98 68 98

permutapermuta é chamada por borbulhaborbulha para fazer a permuta de elementos, no processo de ordenação, quando necessária

permutapermuta é chamada por borbulhaborbulha para fazer a permuta de elementos, no processo de ordenação, quando necessária

Page 23: Profs.:

2323

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

sizeof Retorno do tamanho do operando (em Bytes) Para arrays tamanho de 1 elemento * número de

elementos Como sizeof(int) é igual a 2 bytes, então

int meuArray[ 10 ];printf( "%d", sizeof( meuArray ) );

imprimirá 20

Possibilidade de uso de sizeof com Nomes de variáveis Nomes de tipos Valores constantes

sizeof Retorno do tamanho do operando (em Bytes) Para arrays tamanho de 1 elemento * número de

elementos Como sizeof(int) é igual a 2 bytes, então

int meuArray[ 10 ];printf( "%d", sizeof( meuArray ) );

imprimirá 20

Possibilidade de uso de sizeof com Nomes de variáveis Nomes de tipos Valores constantes

7.6 Cálculo do tamanho de arrays, variáveis e tipos

7.6 Cálculo do tamanho de arrays, variáveis e tipos

Page 24: Profs.:

2424

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.7 Expressões e Aritmética de Apontadores

7.7 Expressões e Aritmética de Apontadores

Operações Aritméticas sobre Apontadores

Incremento/Decremento (++++/----)

Adição de um inteiro a um apontador( + ou += , - ou -=)

Subtração de Apontadores

Operações sem sentido, a menos que executadas sobre um array

Operações Aritméticas sobre Apontadores

Incremento/Decremento (++++/----)

Adição de um inteiro a um apontador( + ou += , - ou -=)

Subtração de Apontadores

Operações sem sentido, a menos que executadas sobre um array

 

Page 25: Profs.:

2525

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Array int com 5 elementos com int armazenado em 4 bytes de memória

vApont aponta para o primeiro elemento v[0] vApont = 3000 (armazenado na locação 3000)

vApont += 2; redireciona vApont para 3008 vApont passará a apontar para v[2]

(incremento de 2)

Array int com 5 elementos com int armazenado em 4 bytes de memória

vApont aponta para o primeiro elemento v[0] vApont = 3000 (armazenado na locação 3000)

vApont += 2; redireciona vApont para 3008 vApont passará a apontar para v[2]

(incremento de 2)

 

7.7 Expressões e Aritmética de Apontadores

7.7 Expressões e Aritmética de Apontadores

V[0]V[0] V[1]V[1] V[2]V[2] V[3]V[3] V[4]V[4]

30003000 30043004 30083008 30123012 30163016 30203020

vApontvApont

vApont += 2

vApont += 2

Page 26: Profs.:

2626

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Subtração de Apontadores Retorno do número de elementos de um para o

outro

Exemplo

vApont2 = &v[ 2 ];vApont1 = &v[ 0 ];

vApont2 - vApont1 produzirá 2 como resultado

Subtração de Apontadores Retorno do número de elementos de um para o

outro

Exemplo

vApont2 = &v[ 2 ];vApont1 = &v[ 0 ];

vApont2 - vApont1 produzirá 2 como resultado

7.7 Expressões e Aritmética de Apontadores

7.7 Expressões e Aritmética de Apontadores

Page 27: Profs.:

2727

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Comparação de Apontadores ( <<, ==== , >> ) Só há sentido se ambos os apontadores são

relativos ao mesmo array

Exemplo Verificação de qual dos apontadores aponta para

o elemento de maior índice do array

Verificação para determinar se se trata de um apontador NULL

Comparação de Apontadores ( <<, ==== , >> ) Só há sentido se ambos os apontadores são

relativos ao mesmo array

Exemplo Verificação de qual dos apontadores aponta para

o elemento de maior índice do array

Verificação para determinar se se trata de um apontador NULL

7.7 Expressões e Aritmética de Apontadores

7.7 Expressões e Aritmética de Apontadores

Page 28: Profs.:

2828

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Apontadores do mesmo tipo podem ser atribuídos um ao outro

Tipos diferentes Necessidade de um operador de conversão

Transformação do tipo do apontador à direita da atribuição para o tipo do operador à esquerda da atribuição

Apontadores do mesmo tipo podem ser atribuídos um ao outro

Tipos diferentes Necessidade de um operador de conversão

Transformação do tipo do apontador à direita da atribuição para o tipo do operador à esquerda da atribuição

7.7 Expressões e Aritmética de Apontadores

7.7 Expressões e Aritmética de Apontadores

Page 29: Profs.:

2929

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Apontadores do mesmo tipo podem ser atribuídos um ao outro

Exceção Apontador para void (tipo void *)

Apontador genérico Representação de qualquer tipo de apontador

Todos os tipos de apontadores podem ser atribuídos a um apontador para void

Nenhuma conversão é necessária

Apontadores para void não podem ser desreferenciados

Apontadores do mesmo tipo podem ser atribuídos um ao outro

Exceção Apontador para void (tipo void *)

Apontador genérico Representação de qualquer tipo de apontador

Todos os tipos de apontadores podem ser atribuídos a um apontador para void

Nenhuma conversão é necessária

Apontadores para void não podem ser desreferenciados

7.7 Expressões e Aritmética de Apontadores

7.7 Expressões e Aritmética de Apontadores

Page 30: Profs.:

3030

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.8 Relação entre Apontadores e Arrays

7.8 Relação entre Apontadores e Arrays

Arrays e Apontadores Relação íntima Uso quase indiferente de ambos Nome de um array Apontador constante Possibilidade de execução de operações de

subscrição a partir do uso de apontadores Exemplo Declaração de um array b[5] e um

apontador bApont Para o uso indistinto de ambos

bApont = b; bApont = b; bApont = &b[0]; bApont = &b[0];

Atribuição explícita de bApont para endereçamento do primeiro elemento de b

Arrays e Apontadores Relação íntima Uso quase indiferente de ambos Nome de um array Apontador constante Possibilidade de execução de operações de

subscrição a partir do uso de apontadores Exemplo Declaração de um array b[5] e um

apontador bApont Para o uso indistinto de ambos

bApont = b; bApont = b; bApont = &b[0]; bApont = &b[0];

Atribuição explícita de bApont para endereçamento do primeiro elemento de b

Page 31: Profs.:

3131

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.8 Relação entre Apontadores e Arrays

7.8 Relação entre Apontadores e Arrays

Arrays e Apontadores Possibilidade de execução de operações de

subscrição a partir do uso de apontadores

Elemento b[3] Possibilidade de acesso a partir de *(bApont +

3) 3 é o offset (deslocamento) *(bApont + n)*(bApont + n) Notação apontador/offset

Possibilidade de acesso a partir de bApont[3] Notação apontador/subscrito

bApont[ 3 ] mesmo que b[ 3 ]bApont[ 3 ] mesmo que b[ 3 ] Possibilidade de acesso a partir da aritmética de

apontadores

*( b + 3 )*( b + 3 )

Arrays e Apontadores Possibilidade de execução de operações de

subscrição a partir do uso de apontadores

Elemento b[3] Possibilidade de acesso a partir de *(bApont +

3) 3 é o offset (deslocamento) *(bApont + n)*(bApont + n) Notação apontador/offset

Possibilidade de acesso a partir de bApont[3] Notação apontador/subscrito

bApont[ 3 ] mesmo que b[ 3 ]bApont[ 3 ] mesmo que b[ 3 ] Possibilidade de acesso a partir da aritmética de

apontadores

*( b + 3 )*( b + 3 )

Page 32: Profs.:

3232

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.9 Arrays de Apontadores

7.9 Arrays de Apontadores

Arrays podem conter apontadores

Exemplo Array de cadeias de caracteres

char *naipe[4]={“Copas", “Paus", “Ouro", “Espadas" };char *naipe[4]={“Copas", “Paus", “Ouro", “Espadas" };

Cadeias de caracteres são apontadores para o primeiro caractere

char *char * Cada elemento de naipenaipe é um apontador para um char char

Cadeias de caracteres não são realmente armazenadas no array naipenaipe, apenas os apontadores para as cadeias de caracteres o são

Arrays podem conter apontadores

Exemplo Array de cadeias de caracteres

char *naipe[4]={“Copas", “Paus", “Ouro", “Espadas" };char *naipe[4]={“Copas", “Paus", “Ouro", “Espadas" };

Cadeias de caracteres são apontadores para o primeiro caractere

char *char * Cada elemento de naipenaipe é um apontador para um char char

Cadeias de caracteres não são realmente armazenadas no array naipenaipe, apenas os apontadores para as cadeias de caracteres o são

 

Page 33: Profs.:

3333

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

naipe[3]naipe[3]

naipe[2]naipe[2]

naipe[1]naipe[1]

7.9 Arrays de Apontadores

7.9 Arrays de Apontadores

Exemplo O array naipe naipe tem tamanho fixo

As cadeias de caracteres podem ter qualquer tamanho

Exemplo O array naipe naipe tem tamanho fixo

As cadeias de caracteres podem ter qualquer tamanho

 

naipe[0]naipe[0] ‘‘C’C’ ‘‘o’o’ ‘‘p’p’ ‘‘a’a’ ‘‘s’s’ ‘‘\\0’0’

‘‘P’P’ ‘‘a’a’ ‘‘u’u’ ‘‘s’s’ ‘‘\\0’0’

‘‘O’O’ ‘‘u’u’ ‘‘r’r’ ‘‘o’o’ ‘‘\\0’0’

‘‘E’E’ ‘‘s’s’ ‘‘p’p’ ‘‘a’a’ ‘‘d’d’ ‘‘a’a’ ‘‘s’s’ ‘‘\\0’0’

Page 34: Profs.:

3434

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

Programa simulador do embaralhamento de cartas

Uso de um array de apontadores para cadeias de caracteres

Uso de um array bidimensional (naipe, face)

Programa simulador do embaralhamento de cartas

Uso de um array de apontadores para cadeias de caracteres

Uso de um array bidimensional (naipe, face)

 

ÁsÁs 22 33 44 55 66 77 88 99 1010 ValeteValete DamaDama ReiRei

00 11 22 33 44 55 66 77 88 99 1010 1111 1212

CopasCopas 00

PausPaus 11

OuroOuro 22

EspadasEspadas 33

baralho[2][10]baralho[2][10] representa o Valete de OuroValete de Ourobaralho[2][10]baralho[2][10] representa o Valete de OuroValete de Ouro

OuroOuroOuroOuro ValeteValeteValeteValete

Page 35: Profs.:

3535

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

Programa simulador do embaralhamento de cartas

Inclusão dos números 1-52 ao array Representação da ordem na qual as cartas são

distribuídas

Programa simulador do embaralhamento de cartas

Inclusão dos números 1-52 ao array Representação da ordem na qual as cartas são

distribuídas

 

Page 36: Profs.:

3636

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Pseudo-código Nível de Topo (Top level)

Embaralhar e distribuir 52 cartas

Primeiro refinamento

Inicializar o array naipenaipeInicializar o array facefaceInicializar o array baralhobaralhoEmbaralhar o baralho

Distribuir 52 cartas

Pseudo-código Nível de Topo (Top level)

Embaralhar e distribuir 52 cartas

Primeiro refinamento

Inicializar o array naipenaipeInicializar o array facefaceInicializar o array baralhobaralhoEmbaralhar o baralho

Distribuir 52 cartas

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

Page 37: Profs.:

3737

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Segundo refinamento

Conversão de Embaralhar e distribuir 52 cartas para

Para cada uma das 52 cartasColocar o número da carta em um espaço desocupado do baralho, selecionado aleatoriamente

Conversão de Distribuir 52 cartas para

Para cada uma das 52 cartasDeterminar o número da carta no baralho e imprimir o valor da face e o naipe da carta

Segundo refinamento

Conversão de Embaralhar e distribuir 52 cartas para

Para cada uma das 52 cartasColocar o número da carta em um espaço desocupado do baralho, selecionado aleatoriamente

Conversão de Distribuir 52 cartas para

Para cada uma das 52 cartasDeterminar o número da carta no baralho e imprimir o valor da face e o naipe da carta

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

Page 38: Profs.:

3838

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Terceiro refinamento

Conversão de Embaralhar e distribuir 52 cartas para

Escolher aleatoriamente um espaço no baralho Ao escolher um espaço já escolhido anteriormente

Escolher aleatoriamente um espaço no baralhoColocar o número da carta no espaço escolhido do baralho

Conversão de Distribuir 52 cartas para

Para cada espaço no array do baralhoSe o espaço tiver um número de carta Imprimir o valor da face e o naipe da carta

Terceiro refinamento

Conversão de Embaralhar e distribuir 52 cartas para

Escolher aleatoriamente um espaço no baralho Ao escolher um espaço já escolhido anteriormente

Escolher aleatoriamente um espaço no baralhoColocar o número da carta no espaço escolhido do baralho

Conversão de Distribuir 52 cartas para

Para cada espaço no array do baralhoSe o espaço tiver um número de carta Imprimir o valor da face e o naipe da carta

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

Page 39: Profs.:

3939

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

01 /* Programa para Embaralhamento e Distribuição de Cartas*/02 #include <stdio.h>03 #include <stdlib.h>04 #include <time.h>0506 void embaralha(int [][ 13 ]);07 void distribui(const int [][ 13 ], const char *[], const char *[]);0809 int main()10 {11 const char *naipe[ 4 ] = {“Copas", “Paus", “Ouro", “Espadas"};12 const char *face[ 13 ] = {“Ás", "Dois", "Três", “Quatro", “Cinco”, “Seis", "Sete", 13 “Oito", “Nove", “Dez”, “Valete", “Dama", “Rei"};14 int baralho[ 4 ][ 13 ] = { 0 };1516 srand( time( 0 ) );22 embaralha(baralho);23 distribui(baralho, face, naipe);25 return 0;26 }

Programa Principal Programa Principal

Page 40: Profs.:

4040

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

27 void embaralha(int cartas[][13])28 {29 int linha, coluna, carta;3031 for (carta = 1; carta <= 52; carta ++){32 do {33 linha = rand()%4;34 coluna = rand()%13;35 }while(cartas[linha][coluna] != 0);36 cartas[linha][coluna] = carta;37 }38 }39 void distribui( const int cartas[][ 13 ], const char *faces[], const char *naipes[] )40 {41 int carta, linha, coluna;42 for (carta = 1; carta <= 52; carta++)43 for (linha = 0; linha <= 3; linha ++)44 for (coluna = 0; coluna <= 12; coluna++)45 if (cartas[linha][coluna] == carta)46 printf( "%6s de %-7s%c", faces[coluna], naipes[linha], carta%2 == 0 ? '\n' : '\t' );47 }

Os números 1-521-52 são aleatoriamente inseridos no array de cartas.

Os números 1-521-52 são aleatoriamente inseridos no array de cartas.

Busca pelo número da carta no baralho, imprimindo o valor da face e naipe.

Busca pelo número da carta no baralho, imprimindo o valor da face e naipe.

Page 41: Profs.:

4141

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

7.10 Estudo de Caso: Simulação de Embaralhamento e Distribuição de Cartas

Exemplo de Saída Exemplo de Saída Seis de Paus Seis de Paus Sete de Ouro Sete de Ouro Ás de EspadasÁs de Espadas Ás de Ouro Ás de Ouro Ás deÁs de Copas Copas Dama de Ouro Dama de Ouro Dama de Paus Dama de Paus Sete de Copas Sete de Copas Dez de Copas Dez de Copas Dois de Paus Dois de Paus Dez de EspadasDez de Espadas Tres de Espadas Tres de Espadas Dez de Ouro Dez de Ouro Quatro de EspadasQuatro de EspadasQuatro de Ouro Quatro de Ouro Dez de Paus Dez de Paus Seis de Ouro Seis de Ouro Seis de Espadas Seis de Espadas Oito de Copas Oito de Copas Tres de Ouro Tres de Ouro Nove de Copas Nove de Copas Tres de Copas Tres de Copas Dois de EspadasDois de Espadas Seis de Copas Seis de Copas Cinco de Paus Cinco de Paus Oito de Paus Oito de Paus Dois de Ouro Dois de Ouro Oito de Espadas Oito de Espadas Cinco de EspadasCinco de Espadas Rei de Paus Rei de Paus Rei de Ouro Rei de Ouro Valete de EspadasValete de Espadas Dois de Copas Dois de Copas Dama de Copas Dama de Copas . .. . . .. . . .. .

Seis de Paus Seis de Paus Sete de Ouro Sete de Ouro Ás de EspadasÁs de Espadas Ás de Ouro Ás de Ouro Ás deÁs de Copas Copas Dama de Ouro Dama de Ouro Dama de Paus Dama de Paus Sete de Copas Sete de Copas Dez de Copas Dez de Copas Dois de Paus Dois de Paus Dez de EspadasDez de Espadas Tres de Espadas Tres de Espadas Dez de Ouro Dez de Ouro Quatro de EspadasQuatro de EspadasQuatro de Ouro Quatro de Ouro Dez de Paus Dez de Paus Seis de Ouro Seis de Ouro Seis de Espadas Seis de Espadas Oito de Copas Oito de Copas Tres de Ouro Tres de Ouro Nove de Copas Nove de Copas Tres de Copas Tres de Copas Dois de EspadasDois de Espadas Seis de Copas Seis de Copas Cinco de Paus Cinco de Paus Oito de Paus Oito de Paus Dois de Ouro Dois de Ouro Oito de Espadas Oito de Espadas Cinco de EspadasCinco de Espadas Rei de Paus Rei de Paus Rei de Ouro Rei de Ouro Valete de EspadasValete de Espadas Dois de Copas Dois de Copas Dama de Copas Dama de Copas . .. . . .. . . .. .

Page 42: Profs.:

4242

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.11 Apontadores para Funções

7.11 Apontadores para Funções

Apontador para função Contém endereço da função na memória

Similar ao fato do nome do array ser o endereço do primeiro elemento

Nome da função é o endereço inicial do código que realiza a tarefa da função

Possibilidades de apontadores para funções

Passagem para funções

Armazenamento em arrays

Atribuição a outros apontadores para função

Apontador para função Contém endereço da função na memória

Similar ao fato do nome do array ser o endereço do primeiro elemento

Nome da função é o endereço inicial do código que realiza a tarefa da função

Possibilidades de apontadores para funções

Passagem para funções

Armazenamento em arrays

Atribuição a outros apontadores para função

Page 43: Profs.:

4343

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Exemplo: Ordenação borbulhante (Bubble Sort)

Função borbulhaborbulha usa um apontador para função

borbulhaborbulha chama uma função auxiliar (permutapermuta)

permutapermuta determina a ordenação ascendente ou descendente

Argumento em borbulhaborbulha para o apontador para permutapermuta

int (*compara)(int, int)

indica a borbulhaborbulha a espera de um apontador para uma função que recebe 2 int e retorna um int

Exemplo: Ordenação borbulhante (Bubble Sort)

Função borbulhaborbulha usa um apontador para função

borbulhaborbulha chama uma função auxiliar (permutapermuta)

permutapermuta determina a ordenação ascendente ou descendente

Argumento em borbulhaborbulha para o apontador para permutapermuta

int (*compara)(int, int)

indica a borbulhaborbulha a espera de um apontador para uma função que recebe 2 int e retorna um int

7.11 Apontadores para Funções

7.11 Apontadores para Funções

Page 44: Profs.:

4444

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Exemplo: Ordenação borbulhante (Bubble Sort) Se os parênteses forem retirados

int *compara(int, int)

declarará uma função que recebe dois inteiros e retorna um apontador para um booleano (int)

Exemplo: Ordenação borbulhante (Bubble Sort) Se os parênteses forem retirados

int *compara(int, int)

declarará uma função que recebe dois inteiros e retorna um apontador para um booleano (int)

7.11 Apontadores para Funções

7.11 Apontadores para Funções

Page 45: Profs.:

4545

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

Parâmetro apontador para funçãoParâmetro apontador para função

7.11 Apontadores para Funções

7.11 Apontadores para Funções

01 /* Programa geral para ordenação de dados - uso de apontadores para funções */01 /* Programa geral para ordenação de dados - uso de apontadores para funções */02 #include <stdio.h>02 #include <stdio.h>03 #define TAMANHO 1003 #define TAMANHO 1004 void borbulha(int [], const int, int (*)(int, int));04 void borbulha(int [], const int, int (*)(int, int));05 int ascendente( int, int );05 int ascendente( int, int );06 int descendente( int, int );06 int descendente( int, int );07 int main()07 int main()08 {08 {09 int ordem, contador, a[TAMANHO] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };09 int ordem, contador, a[TAMANHO] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };10 printf(“Digite 1 para visualizar os dados em ordem crescente,\n” 10 printf(“Digite 1 para visualizar os dados em ordem crescente,\n” 11 “Digite 2 para visualizar os dados em ordem decrescente”);11 “Digite 2 para visualizar os dados em ordem decrescente”);12 scanf(“%d”, &ordem);12 scanf(“%d”, &ordem);13 printf(“\nDados na ordem original\n”);13 printf(“\nDados na ordem original\n”);14 for (contador = 0; contador < TAMANHO ; contador ++)14 for (contador = 0; contador < TAMANHO ; contador ++)15 printf(“%5d”, a[contador]);15 printf(“%5d”, a[contador]);16 if (ordem == 1) {16 if (ordem == 1) {17 borbulha(a, TAMANHO , ascendente);17 borbulha(a, TAMANHO , ascendente);18 printf(“\nDados em ordem crescente\n”);18 printf(“\nDados em ordem crescente\n”);19 }19 }20 else {20 else {21 borbulha(a, TAMANHO , descendente);21 borbulha(a, TAMANHO , descendente);22 printf(“\nDados em ordem decrescente\n”);22 printf(“\nDados em ordem decrescente\n”);23 }23 }24 for ( contador = 0; contadorr < TAMANHO; contador++ )25 printf( "%5d", a[ contador ] ); 26 printf( "\n" );27 return 0;28 }

Page 46: Profs.:

4646

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.11 Apontadores para Funções

7.11 Apontadores para Funções

29 /* Funções borbulha, permuta,, ascendente e descendente */29 /* Funções borbulha, permuta,, ascendente e descendente */30 void borbulha(int b[], const int tam, int (*compara)(int, int))30 void borbulha(int b[], const int tam, int (*compara)(int, int))31 {31 {32 int passeio, contagem;32 int passeio, contagem;33 void permuta(int *, int *);33 void permuta(int *, int *);34 for (passeio = 1; passeio < tam; passeio ++)34 for (passeio = 1; passeio < tam; passeio ++)35 for (contagem = 0; contagem < tam - 1; contagem ++)35 for (contagem = 0; contagem < tam - 1; contagem ++)36 if ((*compara)(b[contagem], b[contagem + 1]))36 if ((*compara)(b[contagem], b[contagem + 1]))37 permuta(&b[contagem], &b[contagem + 1]);37 permuta(&b[contagem], &b[contagem + 1]);38 }38 }39 void permuta(int *apontelem1, int *apontelem2)39 void permuta(int *apontelem1, int *apontelem2)40 {40 {41 int auxi;41 int auxi;42 auxi = *apontelem1;42 auxi = *apontelem1;43 *apontelem1 = *apontelem2;43 *apontelem1 = *apontelem2;44 *apontelem2 = auxi;44 *apontelem2 = auxi;45 }45 }46 int ascendente(int a, int b)46 int ascendente(int a, int b)47 {47 {48 return b < a; /*permuta se b for menor do que a*/48 return b < a; /*permuta se b for menor do que a*/49 int descendente(int a, int b)49 int descendente(int a, int b)50 {50 {51 return b > a; /*permuta se b for maior do que a*/51 return b > a; /*permuta se b for maior do que a*/52 }52 }

ascendenteascendente e descendentedescendente retornam verdadeiro ou falso. borbulhaborbulha chama permutapermuta se a chamada à função retornar verdadeiro.

ascendenteascendente e descendentedescendente retornam verdadeiro ou falso. borbulhaborbulha chama permutapermuta se a chamada à função retornar verdadeiro.

Observar a chamada dos apontadores para funções (uso do operador de desreferência. O uso de ** não é requerido, porém comparacompara é um apontador de função, não uma função.

Observar a chamada dos apontadores para funções (uso do operador de desreferência. O uso de ** não é requerido, porém comparacompara é um apontador de função, não uma função.

Page 47: Profs.:

4747

ran

gel@

dsc.u

fpb

.br

ran

gel@

lmrs

-sem

arh

.ufp

b.b

r

DSC/CCT/UFCGDSC/CCT/UFCG

7.11 Apontadores para Funções

7.11 Apontadores para Funções

Digite 1 para visualizar os dados em ordem crescenteDigite 1 para visualizar os dados em ordem crescenteDigite 1 para visualizar os dados em ordem decrescente : 1Digite 1 para visualizar os dados em ordem decrescente : 1  Dados na ordem originalDados na ordem original 2 6 4 8 10 12 89 68 45 372 6 4 8 10 12 89 68 45 37Dados em ordem crescenteDados em ordem crescente 2 4 6 8 10 12 37 45 68 892 4 6 8 10 12 37 45 68 89

Digite 1 para visualizar os dados em ordem crescenteDigite 1 para visualizar os dados em ordem crescenteDigite 1 para visualizar os dados em ordem decrescente : 1Digite 1 para visualizar os dados em ordem decrescente : 1  Dados na ordem originalDados na ordem original 2 6 4 8 10 12 89 68 45 372 6 4 8 10 12 89 68 45 37Dados em ordem crescenteDados em ordem crescente 2 4 6 8 10 12 37 45 68 892 4 6 8 10 12 37 45 68 89

Digite 1 para visualizar os dados em ordem crescenteDigite 1 para visualizar os dados em ordem crescenteDigite 1 para visualizar os dados em ordem decrescente : 2Digite 1 para visualizar os dados em ordem decrescente : 2  Dados na ordem originalDados na ordem original 2 6 4 8 10 12 89 68 45 372 6 4 8 10 12 89 68 45 37Dados em ordem decrescenteDados em ordem decrescente 89 68 45 37 12 10 8 6 4 289 68 45 37 12 10 8 6 4 2

Digite 1 para visualizar os dados em ordem crescenteDigite 1 para visualizar os dados em ordem crescenteDigite 1 para visualizar os dados em ordem decrescente : 2Digite 1 para visualizar os dados em ordem decrescente : 2  Dados na ordem originalDados na ordem original 2 6 4 8 10 12 89 68 45 372 6 4 8 10 12 89 68 45 37Dados em ordem decrescenteDados em ordem decrescente 89 68 45 37 12 10 8 6 4 289 68 45 37 12 10 8 6 4 2

Page 48: Profs.:

ran

gel@

dsc.u

fpb

.br

DSC/CCT/UFCGDSC/CCT/UFCG

José Eustáquio Rangel de QueirozRoberto Medeiros de Faria

Ulrich Schiel

José Eustáquio Rangel de QueirozRoberto Medeiros de Faria

Ulrich Schiel

DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃODEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO

UNIVERSIDADE FEDERAL DE CAMPINA GRANDEUNIVERSIDADE FEDERAL DE CAMPINA GRANDE

CENTRO DE CIÊNCIAS E TECNOLOGIACENTRO DE CIÊNCIAS E TECNOLOGIA