Buscar

Ponteiros - C

Prévia do material em texto

Ponteiros
Computac¸a˜o Ba´sica
Prof. Marcos F. Caetano
caetano@cic.unb.br
Departamento de Cieˆncia da Computac¸a˜o
Universidade de Bras´ılia
CIC 1/1
Leitura Recomendada
Algoritmos - Teoria e Pra´tica
Thomas Cormen, Charles Leiserson, Ronald Rivest, & Clifford Stein
O M´ıtico Homem-meˆs
Frederick Brooks
A Arte de Resolver Problemas
George Po´lya
Programming Pearls
Jon Bentley
The Pragmatic Programmer
Andrew Hunt & David Thomas
Peopleware
Tom DeMarco & Timothy Lister
CIC Ponteiros - 2/1
Ponteiros
Cada varia´vel declarada ocupa um espac¸o na memo´ria, conforme seu tipo
, e
nome da va´ria´vel e´ apenas uma forma “amiga´vel” de lidar com o enderec¸o
deste espac¸o.
← Ponteiro →
Tipo de dado que armazena um enderec¸o de memo´ria, possibilitando leitura
e escrita deste enderec¸o.
CIC Ponteiros - Ponteiros 3/12
Ponteiros
Cada varia´vel declarada ocupa um espac¸o na memo´ria, conforme seu tipo, e
nome da va´ria´vel e´ apenas uma forma “amiga´vel” de lidar com o enderec¸o
deste espac¸o.
← Ponteiro →
Tipo de dado que armazena um enderec¸o de memo´ria, possibilitando leitura
e escrita deste enderec¸o.
CIC Ponteiros - Ponteiros 3/12
Ponteiros
Cada varia´vel declarada ocupa um espac¸o na memo´ria, conforme seu tipo, e
nome da va´ria´vel e´ apenas uma forma “amiga´vel” de lidar com o enderec¸o
deste espac¸o.
← Ponteiro →
Tipo de dado que armazena um enderec¸o de memo´ria, possibilitando leitura
e escrita deste enderec¸o.
CIC Ponteiros - Ponteiros 3/12
Ponteiros
Em linguagem C, um ponteiro e´ declarado da seguinte forma:
tipo *nome;
Por exemplo:
1 int *ptr_int; // ponteiro para inteiro
2 float *ptr_float; // ponteiro para real
3 char *ptr_char; // ponteiro para caractere
4
5 int **ptr_ptr_int; // ponteiro para (ponteiro para inteiro)
CIC Ponteiros - Ponteiros 4/12
Ponteiros
Em linguagem C, um ponteiro e´ declarado da seguinte forma:
tipo *nome;
Por exemplo:
1 int *ptr_int; // ponteiro para inteiro
2 float *ptr_float; // ponteiro para real
3 char *ptr_char; // ponteiro para caractere
4
5 int **ptr_ptr_int; // ponteiro para (ponteiro para inteiro)
CIC Ponteiros - Ponteiros 4/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char *ptr
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char *ptr
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x00
0x01
0x02
· · ·
0x79
0x7A
0x7B
0x7C
0x7D
· · ·
Conteu´doEnderec¸o
1 byte
0x7D
0x02
0x41
0x41
0x00
0x00
0x00
0x02
char c
float f
char **ptr ptr
char *ptr
CIC Ponteiros - Ponteiros 5/12
Ponteiros
0x020x01
0x410x02
char *ptr
1 /* O enderec¸o de ptr e´: */
2 printf("\n &ptr = %x", &ptr);
/* 0x01 */
3 /* O conteu´do de ptr e´: */
4 printf("\n ptr = %x", ptr);
/* 0x02 */
5 /* O conteu´do do enderec¸o apontado por ptr e´: */
6 printf("\n *ptr = %c", *ptr);
/* A */
CIC Ponteiros - Ponteiros 6/12
Ponteiros
0x020x01
0x410x02
char *ptr
1 /* O enderec¸o de ptr e´: */
2 printf("\n &ptr = %x", &ptr);
/* 0x01 */
3 /* O conteu´do de ptr e´: */
4 printf("\n ptr = %x", ptr);
/* 0x02 */
5 /* O conteu´do do enderec¸o apontado por ptr e´: */
6 printf("\n *ptr = %c", *ptr);
/* A */
CIC Ponteiros - Ponteiros 6/12
Ponteiros
0x020x01
0x410x02
char *ptr
1 /* O enderec¸o de ptr e´: */
2 printf("\n &ptr = %x", &ptr); /* 0x01 */
3 /* O conteu´do de ptr e´: */
4 printf("\n ptr = %x", ptr); /* 0x02 */
5 /* O conteu´do do enderec¸o apontado por ptr e´: */
6 printf("\n *ptr = %c", *ptr); /* A */
CIC Ponteiros - Ponteiros 6/12
Tipagem
A Linguagem C e´ fortemente tipada, o tipo do ponteiro ja´ inclui o tipo do
dado a ser apontado.
0x410xA1
0x000xA2
0x000xA3
0x000xA4
0x140xA5
0xBF0xA6
0x400xA7
0x000xA8
0x000xA9
char c
int i
float f
char *ptr c
int *ptr i
float *ptr f
CIC Ponteiros - Tipagem 7/12
Tipagem
A Linguagem C e´ fortemente tipada, o tipo do ponteiro ja´ inclui o tipo do
dado a ser apontado.
0x410xA1
0x000xA2
0x000xA3
0x000xA4
0x140xA5
0xBF0xA6
0x400xA7
0x000xA8
0x000xA9
char c
int i
float f
char *ptr c
int *ptr i
float *ptr f
CIC Ponteiros - Tipagem 7/12
Tipagem
A Linguagem C e´ fortemente tipada, o tipo do ponteiro ja´ inclui o tipo do
dado a ser apontado.
0x410xA1
0x000xA2
0x000xA3
0x000xA4
0x140xA5
0xBF0xA6
0x400xA7
0x000xA8
0x000xA9
char c
int i
float f
char *ptr c
int *ptr i
float *ptr f
CIC Ponteiros - Tipagem 7/12
Tipagem
A Linguagem C e´ fortemente tipada, o tipo do ponteiro ja´ inclui o tipo do
dado a ser apontado.
0x410xA1
0x000xA2
0x000xA3
0x000xA4
0x140xA5
0xBF0xA6
0x400xA7
0x000xA8
0x000xA9
char c
int i
float f
char *ptr c
int *ptr i
float *ptr f
CIC Ponteiros - Tipagem 7/12
Tipagem
A Linguagem C e´ fortemente tipada, o tipodo ponteiro ja´ inclui o tipo do
dado a ser apontado.
0x410xA1
0x000xA2
0x000xA3
0x000xA4
0x140xA5
0xBF0xA6
0x400xA7
0x000xA8
0x000xA9
char c
int i
float f
char *ptr c
int *ptr i
float *ptr f
CIC Ponteiros - Tipagem 7/12
Tipagem
A Linguagem C e´ fortemente tipada, o tipo do ponteiro ja´ inclui o tipo do
dado a ser apontado.
0x410xA1
0x000xA2
0x000xA3
0x000xA4
0x140xA5
0xBF0xA6
0x400xA7
0x000xA8
0x000xA9
char *ptr c
int *ptr i
float *ptr f
CIC Ponteiros - Tipagem 7/12
Ortogonalidade
Ponteiros sa˜o ortogonais ao sistema.
0x140x13
0x150x14
0xBF0x15
· · ·
0xBE0xBC
0x000xBD
0x410xBE
0xBC0xBF
char c
CIC Ponteiros - Ortogonalidade 8/12
Ortogonalidade
Ponteiros sa˜o ortogonais ao sistema.
0x140x13
0x150x14
0xBF0x15
· · ·
0xBE0xBC
0x000xBD
0x410xBE
0xBC0xBF
char *pc
CIC Ponteiros - Ortogonalidade 8/12
Ortogonalidade
Ponteiros sa˜o ortogonais ao sistema.
0x140x13
0x150x14
0xBF0x15
· · ·
0xBE0xBC
0x000xBD
0x410xBE
0xBC0xBF char **ppc
CIC Ponteiros - Ortogonalidade 8/12
Ortogonalidade
Ponteiros sa˜o ortogonais ao sistema.
0x140x13
0x150x14
0xBF0x15
· · ·
0xBE0xBC
0x000xBD
0x410xBE
0xBC0xBF
char ***pppc
CIC Ponteiros - Ortogonalidade 8/12
Ortogonalidade
Ponteiros sa˜o ortogonais ao sistema.
0x140x13
0x150x14
0xBF0x15
· · ·
0xBE0xBC
0x000xBD
0x410xBE
0xBC0xBF
char *****pppppc
CIC Ponteiros - Ortogonalidade 8/12
Aritme´tica
Pode-se adicionar ou subtrair de ponteiros para acessar outros elementos.
char *
’a’0x33
’b’0x34
’c’0x35
’d’0x36
’e’0x37
’f’0x38
’g’0x39
ptr
int *
0x60
0x61
0x62
0x63
0x64
0x65
0x66
0x67
0x68
0x69
ptr
CIC Ponteiros - Aritme´tica 9/12
Aritme´tica
Pode-se adicionar ou subtrair de ponteiros para acessar outros elementos.
char *
’a’0x33
’b’0x34
’c’0x35
’d’0x36
’e’0x37
’f’0x38
’g’0x39
ptr
(ptr+1)
int *
0x60
0x61
0x62
0x63
0x64
0x65
0x66
0x67
0x68
0x69
ptr
(ptr+1)
CIC Ponteiros - Aritme´tica 9/12
Aritme´tica
Pode-se adicionar ou subtrair de ponteiros para acessar outros elementos.
char *
’a’0x33
’b’0x34
’c’0x35
’d’0x36
’e’0x37
’f’0x38
’g’0x39
ptr
(ptr+3)
int *
0x60
0x61
0x62
0x63
0x64
0x65
0x66
0x67
0x68
0x69
ptr
(ptr+1)
CIC Ponteiros - Aritme´tica 9/12
Aritme´tica
Pode-se adicionar ou subtrair de ponteiros para acessar outros elementos.
char *
’a’0x33
’b’0x34
’c’0x35
’d’0x36
’e’0x37
’f’0x38
’g’0x39
ptr
(ptr+3)
(ptr-2)
int *
0x60
0x61
0x62
0x63
0x64
0x65
0x66
0x67
0x68
0x69
ptr
(ptr+1)
(ptr-21)
CIC Ponteiros - Aritme´tica 9/12
Portabilidade
O uso de ponteiro e sua aritme´tica sa˜o [praticamente] independentes das
diferenc¸as de hardware
CIC Ponteiros - Portabilidade 10/12
Exemplo
0x5AC0
1 int i = 10;
2 char c = ’A’;
3 float f = 1.5;
4 double d = 3.14;
5 int *pi;
6 char *pc;
7 float *pf;
8 double *pd;
9 pi = &i;
10 pc = &c;
11 pf = &f;
12 pd = &d;
13 *(pi)++;
14 *(pc) = tolower(*pc);
15 (*pf) /= 0.3;
16 *pd *= 2;
CIC Ponteiros - Exemplo 11/12
Exemplo
100x5AC0 i 1 int i = 10;
2 char c = ’A’;
3 float f = 1.5;
4 double d = 3.14;
5 int *pi;
6 char *pc;
7 float *pf;
8 double *pd;
9 pi = &i;
10 pc = &c;
11 pf = &f;
12 pd = &d;
13 *(pi)++;
14 *(pc) = tolower(*pc);
15 (*pf) /= 0.3;
16 *pd *= 2;
CIC Ponteiros - Exemplo 11/12
Exemplo
100x5AC0 i
‘A’0x5AC4 c
1 int i = 10;
2 char c = ’A’;
3 float f = 1.5;
4 double d = 3.14;
5 int *pi;
6 char *pc;
7 float *pf;
8 double *pd;
9 pi = &i;
10 pc = &c;
11 pf = &f;
12 pd = &d;
13 *(pi)++;
14 *(pc) = tolower(*pc);
15 (*pf) /= 0.3;
16 *pd *= 2;
CIC Ponteiros - Exemplo 11/12
Exemplo
100x5AC0 i
‘A’0x5AC4 c
1.50x5AC5 f
1 int i = 10;
2 char c = ’A’;
3 float f = 1.5;
4 double d = 3.14;
5 int *pi;
6 char *pc;
7 float *pf;
8 double *pd;
9 pi = &i;
10 pc = &c;
11 pf = &f;
12 pd = &d;
13 *(pi)++;
14 *(pc) = tolower(*pc);
15 (*pf) /= 0.3;
16 *pd *= 2;
CIC Ponteiros - Exemplo 11/12
Exemplo
100x5AC0 i
‘A’0x5AC4 c
1.50x5AC5 f
3.140x5AC9 d
1 int i = 10;
2 char c = ’A’;
3 float f = 1.5;
4 double d = 3.14;
5 int *pi;
6 char *pc;
7 float *pf;
8 double *pd;
9 pi = &i;
10 pc = &c;
11 pf = &f;
12 pd = &d;
13 *(pi)++;
14 *(pc) = tolower(*pc);
15 (*pf) /= 0.3;
16 *pd *= 2;
CIC Ponteiros - Exemplo 11/12
Exemplo
100x5AC0 i
‘A’0x5AC4 c
1.50x5AC5 f
3.140x5AC9 d
?0x5AD1 pi
?0x5AD3 pc
?0x5AD5 pf
?0x5AD7 pd
1 int i = 10;
2 char c = ’A’;
3 float f = 1.5;
4 double d = 3.14;
5 int *pi;
6 char *pc;
7 float *pf;
8 double *pd;
9 pi = &i;
10 pc = &c;
11 pf = &f;
12 pd = &d;
13 *(pi)++;
14 *(pc) = tolower(*pc);
15 (*pf) /= 0.3;
16 *pd *= 2;
CIC Ponteiros - Exemplo 11/12
Exemplo
100x5AC0 i
‘A’0x5AC4 c
1.50x5AC5 f
3.140x5AC9 d
0x5AC00x5AD1 pi
0x5AC40x5AD3 pc
0x5AC50x5AD5 pf
0x5AC90x5AD7 pd
1 int i = 10;
2 char c = ’A’;
3 float f = 1.5;
4 double d = 3.14;
5 int *pi;
6 char *pc;
7 float *pf;
8 double *pd;
9 pi = &i;
10 pc = &c;
11 pf = &f;
12 pd = &d;
13 *(pi)++;
14 *(pc) = tolower(*pc);
15 (*pf) /= 0.3;
16 *pd *= 2;
CIC Ponteiros - Exemplo 11/12
Exemplo
110x5AC0 i
‘a’0x5AC4 c
0.50x5AC5 f
6.280x5AC9 d
0x5AC00x5AD1 pi
0x5AC40x5AD3 pc
0x5AC50x5AD5 pf
0x5AC90x5AD7 pd
1 int i = 10;
2 char c = ’A’;
3 float f = 1.5;
4 double d = 3.14;
5 int *pi;
6 char *pc;
7 float *pf;
8 double *pd;
9 pi = &i;
10 pc = &c;
11 pf = &f;
12 pd = &d;
13 *(pi)++;
14 *(pc) = tolower(*pc);
15 (*pf) /= 0.3;
16 *pd *= 2;
CIC Ponteiros - Exemplo 11/12
Resumo
Ponteiros
Tipagem
Ortogonalidade
Aritme´tica
Portabilidade
CIC Ponteiros - Resumo 12/12
	Ponteiros
	Tipagem
	Ortogonalidade
	Aritmética
	Portabilidade

Outros materiais