Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Estadual do Centro Oeste - UNICENTRO Departamento de Ciência da Computação - DECOMP Programação de Computadores II PonteirosPonteiros Variáveis Ponteiros (1) � O primeiro passo para entender ponteiros é visualizar o que eles representam em nível de máquina. � Nos computadores mais modernos a memória é dividida em bytes, sendo que cada byte é dividido em bits. � Cada byte têm um endereço único. 2 Variáveis Ponteiros (2) � Se existem n bytes na memória. Pode-se pensar em endereços como números que estão entre 0 e n-1. 3 Variáveis Ponteiros (3) � Cada variável em um programa ocupa um ou mais bytes de memória. � O endereço do primeiro byte é dito ser o endereço da variável. � Na figura seguinte, o endereço da variável i é 2000. 4 Variáveis Ponteiros (4) � Endereços podem ser armazenados em variáveis especiais denominadas ponteiros. � Quando armazena-se o endereço da variável i na variável ponteiro p, diz-se que p “aponta” para i. � Uma representação gráfica: 5 Declaração de variáveis ponteiros (1) � Quando uma variável ponteiro é declarada, seu nome deve ser precedido por um asterisco: int *p; � p é uma variável ponteiro que aponta para um objeto do tipo int.do tipo int. � Usa-se o termo objeto em vez de variável pois p pode apontar para uma área de memória que não pertence a uma variável. 6 Declaração de variáveis ponteiros (2) � Variáveis ponteiros podem aparecer em declarações junto com outras variáveis: int i, j, a[10], b[20], *p, *q; � C requer que toda variável ponteiro aponte somente para objetos de um tipo particular (o tipo referenciado): int *p; /* aponta somente para inteiros */int *p; /* aponta somente para inteiros */ double *q; /* aponta somente para doubles */ char *r; /* aponta somente para caracteres */ float *som /* aponta somente para floats */ � Não existem restrições em relação a quais tipos podem ser referenciados. 7 Operadores de endereço e indireção � C fornece um par de operadores projetados especificamente para uso com ponteiros. � Para encontrar o endereço de uma variável, usa-se & (operador de endereço). � Para obter acesso ao objeto que um ponteiro aponta, usa-se * (operador de indireção ou de desreferenciação).(operador de indireção ou de desreferenciação). 8 Operador de endereço (1) � A seguir está declarada uma variável ponteiro que é capaz de apontar para um objeto do tipo int, esta variável reserva espaço para um ponteiro, porém, o ponteiro não aponta para um objeto em particular. int *p; /* p não aponta para nada em particular */ � É fundamental inicializar a variável ponteiro p antes de usá-la. 9 Operador de endereço (2) � Um modo de inicializar uma variável ponteiro é atribuir para a variável ponteiro o endereço de uma variável: int i, *p; … p = &i;p = &i; � Atribuição do endereço de i à variável p faz p apontar para i: 10 Operador de endereço (3) � Também é possível inicializar uma variável ponteiro quando esta variável é declarada: int i; int *p = &i; � A declaração de i pode ser realizada junto com a � A declaração de i pode ser realizada junto com a declaração e inicialização de p: int i, *p = &i; 11 Operador de indireção (1) � Uma vez que uma variável ponteiro aponta para um objeto, pode-se usar o operador * (indireção) para acessar o que está armazenado no objeto. � Se p aponta para i, pode-se imprimir o valor de i como está descrito a seguir:descrito a seguir: printf("%d\n", *p); 12 Operador de indireção (2) � Como p aponta para i, *p é um alias de i. � *p tem o mesmo valor de i. � Alterar o valor de *p altera o valor de i. � O exemplo do próximo slide ilustra a equivalência de *p e i.e i. 13 Operador de indireção (3) � p = &i; � i = 1; printf("%d\n", i); /* imprime 1 */printf("%d\n", i); /* imprime 1 */ printf("%d\n", *p); /* imprime 1 */ *p = 2; printf("%d\n", i); /* imprime 2 */ printf("%d\n", *p); /* imprime 2 */ 14 Operador de indireção (4) � Usar uma variável ponteiro não inicializada causa comportamento indefinido: int *p; printf("%d", *p); /*** ERRADO ***/ � Atribuir um valor para *p é particularmente perigoso, ou seja, atribuir um valor para uma variável ponteiro não inicializada:atribuir um valor para uma variável ponteiro não inicializada: int *p; *p = 1; /*** ERRADO ***/ 15 Atribuição de Ponteiros (1) � C permite o uso do operador de atribuição para copiar ponteiros do mesmo tipo. � A seguinte declaração de variáveis será usada para exemplificar as atribuições de ponteiros: int i, j, *p, *q;int i, j, *p, *q; � Exemplo de atribuição de ponteiros: p = &i; 16 Atribuição de Ponteiros (2) � Outro exemplo de atribuição de ponteiro: q = p; q agora aponta para o mesmo lugar que p: 17 Atribuição de Ponteiros (3) � Se p e q apontam para i, pode-se alterar i ao atribuir um novo valor para *p ou *q: *p = 1; *q = 2;*q = 2; � Qualquer número de variáveis ponteiros podem apontar para o mesmo objeto. 18 Atribuição de Ponteiros (4) � Tenha cuidado para não confundir q = p; com *q = *p; � A primeira declaração é uma atribuição de ponteiro, mas a segunda não.segunda não. � O exemplo do próximo slide mostra o efeito da segunda declaração. 19 Atribuição de Ponteiros (5) p = &i; q = &j; i = 1; *q = *p; 20 Exemplo de programa – usando o operador de endereço (1) #include <stdio.h> int main(void){ int a = 1, b = 2, c = 3; printf("O endereco de a ‚ %d o valor de a ‚ %d\n", &a, a); printf("O endereco de b ‚ %d o valor de b ‚ %d\n", &b, b);printf("O endereco de b ‚ %d o valor de b ‚ %d\n", &b, b); printf("O endereco de c ‚ %d o valor de c ‚ %d\n", &c, c); return 0; } 21 Exemplo de programa – usando variáveis ponteiro (2) Este programa ilustra o uso de variáveis ponteiro. Uma variável ponteiro (i_ponteiro) é declarada e o endereço de uma variável inteira (a) é atribuído a ela. O programa então usa a variável ponteiro (i_ponteiro) para alterar, exibir e atribuir o valor da variável inteira (a). #include <stdio.h> int main(void) { int a = 1, b = 2, *i_ponteiro; i_ponteiro = &a; /* Atribui um endereco a i_ponteiro */ printf("O valor da variavel a: %d\n", a);printf("O valor da variavel a: %d\n", a); *i_ponteiro = 5; /* Altera o valor apontado por i_ponteiro para 5 */ printf("O valor da variavel a: %d\n", a); printf("O valor apontado por i_ponteiro: %d\n", *i_ponteiro); b = *i_ponteiro; /* b recebe o valor apontado por i_ponteiro */ printf("O valor de b: %d\n", b); printf("Valor de i_ponteiro: %d\n", *i_ponteiro); return 0; } 22
Compartilhar