Baixe o app para aproveitar ainda mais
Prévia do material em texto
Variáveis do Tipo Ponteiros (apontador/ pointer) Ponteiro: É um tipo especial de variável cujo conteúdo (valor) é um endereço de memória, ou seja, esse tipo de variável aponta para o endereço de memória de uma outra variável. Ponteiro: É um tipo especial de variável cujo conteúdo (valor) é um endereço de memória, ou seja, esse tipo de variável aponta para o endereço de memória de uma outra variável. Vantagens do uso de Ponteiros: • Trabalhar com alocação dinâmica de memória; • Passar o endereço de uma variável como argumento de uma função. Assim, no corpo dessa função será possível manipular diretamente o conteúdo da variável, por meio de seu endereço; • Passar o endereço de uma função para uma outra função; • Acessar/manipular diretamente a memória do computador. Vantagens do uso de Ponteiros: • Trabalhar com alocação dinâmica de memória; • Passar o endereço de uma variável como argumento de uma função. Assim, no corpo dessa função será possível manipular diretamente o conteúdo da variável, por meio de seu endereço; • Passar o endereço de uma função para uma outra função; • Acessar/manipular diretamente a memória do computador. I n t r o d u ç ã o à C i ê n c i a d a C o m p u t a ç ã o – P r o f . P i t e r i A u l a - P o n t e i r o s ( i n t r o d u ç ã o ) Atenção: O uso incorreto de ponteiros é muito grave e pode ocasionar sérios problemas (erros difíceis de serem “corrigidos”). O uso de um debugger ajuda muito nessa tarefa. Atenção: O uso incorreto de ponteiros é muito grave e pode ocasionar sérios problemas (erros difíceis de serem “corrigidos”). O uso de um debugger ajuda muito nessa tarefa. Variáveis (simples ou estruturadas) e funções (código associado) possuem uma localização fisíca na memória do computador, ou seja, um endereço. Variáveis do Tipo Ponteiros (apontador/ pointer) I n t r o d u ç ã o à C i ê n c i a d a C o m p u t a ç ã o – P r o f . P i t e r i A u l a - P o n t e i r o s ( i n t r o d u ç ã o ) Declaração de variáveis do tipo ponteiro Forma Geral Tipo_de_dado *nome da variavel;Tipo_de_dado *nome da variavel; Onde: Tipo_de_dado indica o tipo de dado dos objetos que a variável nome_da_variavel aponta. O asterisco (*) precedendo o nome da variável indica que ela é do tipo ponteiro. Onde: Tipo_de_dado indica o tipo de dado dos objetos que a variável nome_da_variavel aponta. O asterisco (*) precedendo o nome da variável indica que ela é do tipo ponteiro. I n t r o d u ç ã o à C i ê n c i a d a C o m p u t a ç ã o – P r o f . P i t e r i A u l a - P o n t e i r o s ( i n t r o d u ç ã o ) Exemplos ... int a, b, c; int *pa,*pb,*pc; a = 10, b = 20, c = 30; pa = &a; pb = &b; Pc = &c; 10 3020 1328 53480 701828 1328 53480 a b c pa pb 701828 pc pa = “ponteiro para o endereço base da variável (primeiro byte)”, *pa =“conteúdo da variável apontada por pa” Atenção!!!Atenção!!! 28 18 2328 I n t r o d u ç ã o à C i ê n c i a d a C o m p u t a ç ã o – P r o f . P i t e r i A u l a - P o n t e i r o s ( i n t r o d u ç ã o ) Inicialização de variáveis do tipo de ponteiro ... int *pa = NULL; ... pa Da mesma forma que podemos inicializar variáveis no momento de sua declaração, também podemos inicializar variáveis do tipo ponteiro. Uma boa pratica de programação é inicializar todos os ponteiros no momento de sua declaração com a constante simbólica pré-definida NULL (<stdio.h>). Isso indica que o ponteiro (variável) não aponta para nenhum objeto na memória. Observação: Poderíamos usar 0 (zero) ou 0L (zero longo) no lugar de NULL, entretanto o uso dessa constante é mais significativo e recomendado (faz você lembrar que a variável é do tipo apontador). Representação diagramática usada para representar essa ação Representação diagramática usada para representar essa ação I n t r o d u ç ã o à C i ê n c i a d a C o m p u t a ç ã o – P r o f . P i t e r i A u l a - P o n t e i r o s ( i n t r o d u ç ã o ) Exemplos de Códigos e respectivas Funcionalidades int main(void){ int a = 10, b = 20; printf(“Antes de troca”); printf(“%d e %d”,a, b); Troca(a,b); printf(“Depois da troca”); printf(“%d e %d”,a, b); } void Troca( int *A, int *B){ int aux; aux = *A; *A = *B; *B = aux; } void Troca( int A, int B){ int aux; aux = A; A = B; B = aux; } int main(void){ int a = 10, b = 20; printf(“Antes de troca”); printf(“%d e %d”,a, b); Troca(&a,&b); printf(“Depois da troca”); printf(“%d e %d”,a, b); } O que acontece em ambas as situações ? I n t r o d u ç ã o à C i ê n c i a d a C o m p u t a ç ã o – P r o f . P i t e r i A u l a - P o n t e i r o s ( i n t r o d u ç ã o ) Æ Variáveis do tipo “ponteiro” podem ser usadas em expressões aritméticas e boleanas; Æ Atribuição: Uma variável do tipo ponteiro só pode receber: • o endereço de uma variável do tipo que ela aponta, ou; • uma cópia de um outro ponteiro do mesmo tipo. Observações I n t r o d u ç ã o à C i ê n c i a d a C o m p u t a ç ã o – P r o f . P i t e r i A u l a - P o n t e i r o s ( i n t r o d u ç ã o ) Aritmética: Operações básicas: • Soma e subtração (p-3, p+3); • Incremento e decremento unitário (++p, p++, - -p, p- -); • Podemos usar os operadores +=, -=; p p+1p-1 Aritmética de Ponteiros Vamos admitir que p aponta para o endereço base (1 byte) de uma variável. Como o Compilador sabe o tipo de dado e o tamanho (bytes) ocupado por cada tipo, a partir do endereço base, ele pega a quantidade de bytes adjacentes necessários. I n t r o d u ç ã o à C i ê n c i a d a C o m p u t a ç ã o – P r o f . P i t e r i A u l a - P o n t e i r o s ( i n t r o d u ç ã o ) ... memória ... byte p p+1p-1 Atenção!!! Operações aritméticas sobre ponteiros são diferentes das operações aritméticas usuais. Atenção!!! Operações aritméticas sobre ponteiros são diferentes das operações aritméticas usuais. Aritmética de Ponteiros Nesse exemplo, estamos supondo que p aponta para o endereço base de uma variável que ocupa 4 bytes. I n t r o d u ç ã o à C i ê n c i a d a C o m p u t a ç ã o – P r o f . P i t e r i A u l a - P o n t e i r o s ( i n t r o d u ç ã o ) ... memória ... byte ... continua
Compartilhar