Ponteiros em C - Prof. Carlos Eduardo Batista

Propaganda
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 = π
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]
Download