Baixe o app para aproveitar ainda mais
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
Compartilhar