Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação Estruturada II Aula 7 – Ponteiros Prof: Efrem Lousada efrem.lousada@anhanguera.com plainit.co/u/efrem Sumário Prof: Efrem Lousada 2 1. Revisão Funções e Estruturas 2. Definição Ponteiros 2. Como funcionam 3. Declarando 4. Utilizando 5. Incremento e Decremento 6. Relação com Vetores Ponteiros Prof: Efrem Lousada 3 • Ponteiros é um dos tópicos mais difíceis da linguagem C. • A linguagem C é altamente dependente dos ponteiros. Para ser um bom programador em C é fundamental que se tenha um bom domínio deles. • Ponteiros são tão importantes na linguagem C que você já os viu e nem percebeu, pois mesmo para se fazer um introdução básica à linguagem C precisa-se deles. Ponteiros Prof: Efrem Lousada 4 Definição • Na linguagem C, cada vez que é declarada uma variável (por exemplo, char ch1) é associado a esta variável um número hexadecimal (ex: 0022FF77) que é denominado de endereço. • Esse número realiza a associação entre o nome da variável com o espaço físico que ela ocupa na memória do computador. Ponteiros Prof: Efrem Lousada 5 Como Funcionam • Da mesma forma que declaramos variáveis para armazenar inteiros, podemos declarar variáveis que, em vez de servirem para armazenar valores inteiros, servem para armazenar endereços de memória onde há variáveis inteiras armazenadas. Ponteiros são variáveis que guardam endereços de memória. Ponteiros Prof: Efrem Lousada 6 Como Funcionam • Um ponteiro nada mais é que uma variável capaz de armazenar um número hexadecimal que corresponde a um endereço de memória de outra variável. Para atribuir e acessar endereços de memória, a linguagem utiliza dois operadores : & e * Ponteiros Prof: Efrem Lousada 7 Como Funcionam • O operador unário & (“endereço de”), aplicado a variáveis, resulta no endereço da posição da memória reservada para a variável. • O operador unário * (“conteúdo de”), aplicado a variáveis do tipo ponteiro, acessa o conteúdo do endereço de memória armazenado pela variável ponteiro. Ponteiros Prof: Efrem Lousada 8 Declarando • Para declarar um ponteiro temos a seguinte forma geral: tipo_do_ponteiro *nome_da_variável; int *pt; char *temp,*pt2; Ponteiros - Utilizando Prof: Efrem Lousada 9 • Suponha por exemplo que a variável val, armazene dentro dela um valor inteiro. • Quando ela é declarada (int val;), o compilador reservará automaticamente um espaço na memória (caixinha) para ela. valor de val val 0022ff64 endereço de val Ponteiros - Utilizando Prof: Efrem Lousada 10 • Considere: int val=10; int *pt1, *pt2=NULL; 10 0022ff64 endereço de val val Ponteiros - Utilizando Prof: Efrem Lousada 11 • Considere: int val=10; int *pt1, *pt2=NULL; pt1=&val; // pt1 passa a apontar para val 10 0022ff64 endereço de val pt1 val Ponteiros - Utilizando Prof: Efrem Lousada 12 • Considere: int val=10; int *pt1, *pt2=NULL; pt1=&val; // pt1 passa a apontar para val *pt1=123; // altera o conteúdo de val 123 0022ff64 endereço de val pt1 val Ponteiros Prof: Efrem Lousada 13 Atribuição • Se p1 e p2 são ponteiros, então a atribuição p1 = p2; faz p1 apontar para o mesmo endereço apontado por p2 • Para fazer a região apontada por p1 ter o mesmo valor da região apontada por p2 devemos fazer *p1 = *p2; Ponteiros Prof: Efrem Lousada 14 Incremento e Decremento • Quando incrementamos um ponteiro estamos fazendo ele apontar para o próximo elemento do vetor – Se p é um ponteiro para inteiro (int *p;), e p armazena o endereço 100, então p++ faz p armazenar o endereço 104 (pois um inteiro ocupa 4 bytes) – A mesma regra vale para decremento • Para incrementar o conteúdo da região apontada por p fazemos (*p)++; Ponteiros Prof: Efrem Lousada 15 Soma/subtração de ponteiros com inteiros • Para fazer um ponteiro p apontar para N elementos a frente fazemos p += N; ou p = p+N; • Para acessar o conteúdo de N elementos a frente usamos *(p+N) • A subtração funciona de forma similar Ponteiros Prof: Efrem Lousada 16 Relação com vetores • Ponteiros e vetores têm uma ligação muito forte. • Vimos que um vetor é declarado da seguinte forma: tipo_da_variável nome_da_variável [tam]; • Quando isto é feito, o compilador C, calcula o tamanho, em bytes, necessário para armazenar o vetor. Este tamanho é: tam x tamanho_do_tipo Ponteiros - Relação com vetores Prof: Efrem Lousada 17 • A seguir, o compilador aloca o número de bytes que ele calculou, em um espaço livre de memória. • O nome do vetor declarado é na verdade um ponteiro para o tipo de variável do vetor. • Este conceito é fundamental porque, uma vez que foi alocado na memória o espaço para o vetor, o compilador pega o nome da variável (que é um ponteiro) e aponta para o primeiro elemento do vetor. Ponteiros Prof: Efrem Lousada 18 Relação com vetores Ex.: main() { int v[] = {10, 20, 30}; printf("%p\n", v); printf("%p\n", v+2); printf("%d\n", *(v+2)); } Ponteiros Prof: Efrem Lousada 19 Exercícios 1) Resolver os exercícios do Livro Texto Exercícios de autorrevisão - 7.3 e 7.4 Páginas 243 e 244 Obs: No livro já tem as respostas, tente fazer e depois verifique se esta correto Ponteiros Prof: Efrem Lousada 20 Exercícios 2) Fazer um programa para: declarar variáveis a, b, c, d do tipo int. declarar variáveis e, f, g, h do tipo float. declarar vetor v de 10 elementos do tipo char. declarar variável x do tipo int. criar um ponteiro apontando para o endereço de a. incrementar o ponteiro, mostrando o conteúdo do endereço apontado (em forma de número) e seu endereço. Ponteiros Prof: Efrem Lousada 21 Exercícios 3) Fazer uma função para: Receber dois ponteiros para char (char*) como parâmetro e um número representando uma certa quantidade de caracteres. Procurar, no vetor apontado pelo parâmetro 1, o primeiro caractere de espaço (‘ ‘) ou o fim de vetor (representado pela quantidade fornecida no parâmetro 3). Copiar os caracteres anteriores ao espaço no vetor indicado pelo segundo parâmetro. Retornar o número de caracteres copiados. Fim, Obrigado! Prof: Efrem Lousada 22
Compartilhar