Download - 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
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
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
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)
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
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
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
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
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
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
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.
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
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)
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
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)
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
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
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 ***
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
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
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.
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
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
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
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
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
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
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
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
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
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 )
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
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’
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
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
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
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
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
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
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.
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 . .. . . .. . . .. .
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
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
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
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 }
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.
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
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