Estrutura de Dados Carlos Eduardo Batista Centro de Informática - UFPB [email protected] Aritmética de ponteiros em C (continuação) ◦ O que acontece na memória? ◦ Ponteiro para ponteiro etc. Estruturas de Dados 2 Gabarito do Exercício Implementar a TAD Ponto e suas operações (slide 19 da aula passada) Exercício 3 Criando ponto… 5 6 7 8 9 10 11 12 13 14 15 typedef struct t_ponto{ double x; double y; } Ponto; Ponto criarPonto(double xx, double yy) { Ponto np; np.x = xx; np.y = yy; return np; } Exercício 4 Distância entre dois pontos… 17 double distancia(const Ponto p1, Ponto p2) { 18 return sqrt((double) ( (p2.x - p1.x)*(p2.x - p1.x) ) + 19 ( (p2.y - p1.y)*(p2.y - p1.y) ) ); 20 21 } Exercício 5 Quadrante de um ponto… 23 int quadrante(Ponto p1) { 24 if( ( (p1.x)> 0) && ((p1.y)>0)) { 25 return 1; 26 } else if( ( (p1.x)< 0) && ((p1.y)>0)) { 27 return 2; 28 } else if( ( (p1.x)< 0) && ( (p1.y )< 0) ) { 29 return 3; 30 } else if( ( (p1.x)> 0) && ((p1.y)<0)) { 31 return 4; 32 } 33 } Exercício 6 36 int main(int argc, char *argv[]) { 37 Ponto p1, p2; 38 p1 = criarPonto(2,3); 39 p2 = criarPonto(-5,6); 40 41 printf("Quadrante de p1: %d\n",quadrante(p1)); 42 printf("Quadrante de p2: %d\n",quadrante(p2)); 43 44 printf("Distancia entre p1 e p2: %f\n", 45 distancia(p1,p2)); 46 return 0; 47 } Exercício 7 Operador & ◦ Endereço de ◦ Operador unário que devolve o endereço na memória do seu operando Operador * ◦ No endereço de ◦ Operador unário que devolve o valor da variável localizada no endereço do seu operando m = &count; q = *m; Aritmética de ponteiros em C 8 int *piValor; /* ponteiro para inteiro */ int iVariavel = 1234234; piValor = &iVariavel; /* endereço de memória */ printf ("Endereco: %d\n", piValor); printf ("Valor : %d\n", *piValor); *piValor = 180118 ; printf ("Valor alterado: %d\n", iVariavel); printf ("Endereco : %d\n", piValor); Aritmética de ponteiros em C 9 Arrays e ponteiros Não apenas o conteúdo de ponteiros pode ser usado em expressões aritméticas, mas também os endereços dos ponteiros main() { int arr[10]; int *el; int i; el = &arr[0]; /* arr: arranjo com 10 inteiros */ /* el: ponteiro para um inteiro */ /* inicializa ponteiro */ /* inicializa conteudo do arranjo via ponteiro */ for (i=0; i<10; ++i) *(el + i) = 0; } Aritmética de ponteiros em C 10 Se p1 e p2 são ponteiros ◦ p1 = p2 p1 passa apontar para o mesmo endereço que p2 Para que a região apontada por p1 passe a ter o mesmo valor da região apontada por p2 ◦ *p1 = *p2 Operadores relacionais podem testar ◦ == se apontam para mesma posição ◦ != se apontam para posições diferentes ◦ > >= < <= qual aponta para maior posição Aritmética de ponteiros em C 11 main() { int v[] = {1, 2, 3, 4, 5, 6}, *p; for (p = v; p <= &v[5]; p++) printf("%d\n", *p); } Aritmética de ponteiros em C 12 int a; int* p; a = 10; p = &a; *p = 5; printf(“%d”,a); Qual o valor exibido? Ponteiros em C 13 int A, B, S; int* ptA; int* ptB; int* ptS; A = 2; B = 3; ptA = &A; ptB = &B; ptS = &S; *ptS = *ptA + *ptB; printf("Resultado = %d",S); Ponteiros em C 14 int* e; *e = (int*)malloc(sizeof(int)); if (e == NULL) { printf(“Memória cheia”); exit(1); } *e = 10; printf(“e = %p e contém %d”,e,*e); free(e); Ponteiros em C 15 Funções ◦ Não é permitido o aninhamento de funções em ANSI C ◦ Parâmetros são passados por valor Ponteiros são passados como valor ◦ Referência via manipulação direta da memória ◦ Mecanismo para definição de número arbitrário de parâmetros printf(const char* ...) Tipos Abstratos de Dados 16 #include <stdio.h> void (*f)(char *, int); void fun1(char *s, int i){ printf("fun1: %s, %d\n", s, i); } void fun2(char *s, int i){ printf("fun2: %s, %d\n", s, i); } int main(void) { int cond; printf("Condicao (0, 1): "); scanf(" %d", &cond); if (cond) f = &fun1; else f = &fun2; (*f)("AP", 8); return 0; } 17 #include <stdio.h> double swap_doubles_ptr(double *d1, double *d2){ double temp; temp = *d1; *d1 = *d2; *d2 = temp; } int main(void) { double e, f; e = 5.0, f = 7.0; printf("%f %f\n", e, f); swap_doubles_ptr(&e, &f); printf("%f %f\n", e, f); return 0; // 5.0 7.0 // 7.0 5.0 } Tipos Abstratos de Dados 18 Ponteiro para ponteiro ◦ Ponteiro que guarda o endereço de memória de outro ponteiro tipo **nome ◦ *nome = conteúdo do ponteiro intermediário (um endereço) ◦ **nome = conteúdo da região final apontada (um valor) Ponteiro para ponteiro para ponteiro… Ponteiros em C 19 int *piVariavel; *piVariavel = (int *) malloc(sizeof(int)); //ADDR 4 *piVariavel = 20; printf(“%d\n”,&piVariavel); //1 printf(“%d\n”,piVariavel); //4 printf(“%d\n”,*piVariavel); //20 Ponteiros em C 20 #include <stdio.h> #include <stdlib.h> int funcao(int **piParametro) { printf("%d\n",&piParametro); printf("%d\n",piParametro); printf("%d\n",*piParametro); printf("%d\n",**piParametro); return 0; } int main( void ) { int *piVariavel; *piVariavel = (int *) malloc(sizeof(int); *piVariavel = 20; printf("%d\n",&piVariavel); printf("%d\n",piVariavel); printf("%d\n",*piVariavel); funcao( &piVariavel ); return 0; } Ponteiros em C 21 Ponteiros em C 22 Ponteiros em C 23 main() { float pi = 3.1415, *pf, **ppf; pf = &pi; ppf= &pf; printf("%f\n", **ppf); printf("%f\n", *pf); } Ponteiros em C 24 Refazer exercício anterior usando ponteiros... 1) Função para criar ponto retornando ponteiro 2) Função para calcular a distância recebendo ponteiro para ponto 3) Função para calcular quadrante recebendo ponteiro para ponto 4) Definir um array com 5 pontos 5) Função para exibir pontos de forma ordenada (por quadrante) – recebe ponteiro para ponteiro de ponto Exercício 25 Métodos de pesquisa e classificação de dados (resumo) Pilhas e Filas Próximas aulas 26 https://code.google.com/p/learnc/ Notas de Aula do Prof. Bruno B. Boniati Referências 27 Estrutura de Dados Carlos Eduardo Batista Centro de Informática - UFPB [email protected]