Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROGRAMAÇÃO II AULA 6 – PONTEIROS CIÊNCIA DA COMPUTAÇÃO INTRODUÇÃO Ponteiros são um dos recursos mais poderosos da linguagem C e de outras; A tentativa de evitá-los implicará quase sempre códigos maiores e de execução mais lenta. Para quem está começando, pode parecer (e algumas vezes é) um tanto difícil. Mas não há outro caminho senão enfrentar a realidade. 2 INTRODUÇÃO São muitas as aplicações de ponteiros. A seguir, relação das mais comuns. Alocação de estruturas dinâmicas de dados; Manipulação de arrays e strings; Passagem de parâmetros por referência; Retornar mais de um valor para uma função. 3 COMO FUNCIONAM OS PONTEIROS Ints guardam inteiros, floats guardam números de ponto flutuante, Ponteiros guardam endereços de memória; Quando você anota o endereço de um colega você está criando um ponteiro. O C funciona assim, você anota o endereço de algo numa variável ponteiro para depois usar. 4 COMO FUNCIONAM OS PONTEIROS No C quando declaramos ponteiros nós informamos ao compilador para que tipo de variável vamos apontá-lo; 5 DECLARANDO E UTILIZANDO PONTEIROS Para declarar um ponteiro temos a seguinte forma geral: (*) que faz o compilador saber que aquela variável não vai guardar um valor mas sim um endereço; É necessário inicializar os ponteiros, assim como toda variável declarada em C; Apontam para um lugar indefinido; 6 DECLARANDO E UTILIZANDO PONTEIROS O ponteiro deve ser inicializado (apontando para algum lugar conhecido) antes de ser usado! Para atribuir um valor a um ponteiro recém- criado poderíamos igualá-lo a um valor de memória. Para saber o endereço de uma variável basta usar o operador: & 7 DECLARANDO E UTILIZANDO PONTEIROS Após inicializar o ponteiro, você esta “liberado” para utilizá-lo; Podemos, por exemplo, alterar o valor de count usando pt; Para tanto vamos usar o operador “inverso” do operador &, o operador *; *pt é equivalente ao próprio count; *pt = 12; 8 PROJETO 1: 9 DECLARANDO E UTILIZANDO PONTEIROS & = é equivalente a ligar para fábrica e pegar o endereço; * = faz uma visita à empresa aplicando o operador ao papel 10 variável ponteiro PROJETO 2 11 DECLARANDO E UTILIZANDO PONTEIROS Podemos fazer algumas operações aritméticas com ponteiros; p1 = p2; *p1 = *p2; Incremento e decremento de ponteiros Quando incrementamos um ponteiro ele passa a apontar para o próximo valor do mesmo tipo o qual o ponteiro aponta; Se você incrementa um ponteiro char* ele anda 1 byte, já um ponteiro double* ele anda 8 bytes na memória. 12 DECLARANDO E UTILIZANDO PONTEIROS O exemplo acima é uma operação com ponteiro (p um tipo *p). Mas podemos também incrementar o conteúdo de um ponteiro; Outras operações aritméticas úteis são a soma e subtração de inteiros com ponteiros 13 DECLARANDO E UTILIZANDO PONTEIROS E se você quiser usar o conteúdo do ponteiro, 15 posições adiante: Comparação entre dois ponteiros: == != p ou *p; >= <= qual dos dois ponteiros está mais adiante na memória Operações que você não pode efetuar com ponteiros: dividir ou multiplicar, adicionar ou subtrair floats ou doubles; 14 DECLARANDO E UTILIZANDO PONTEIROS É uma boa prática incluir as letras ptr em nomes de variáveis de ponteiros para tornar claro que essas variáveis são ponteiros e precisam ser manipuladas corretamente; int y = 5; int *yptr; Basicamente, depois que se aprende a usar os dois operadores (& e *) fica fácil entender operações com ponteiros 15 EXERCÍCIOS Explique a diferença entre: p++; (*p)++; *(p++) O que quer dizer *(p+10)? Sendo declarado: int a=2; b =2; int *p1 *p2; p1 = &a; p2 = & b; Qual a diferença entre p1 == p2 e *p1 == *p2? 16 EXERCÍCIOS Qual o valor de y no final do programa? Escreva um comentário em cada comando de atribuição explicando o que ele faz e o valor da variável à esquerda do ‘=‘ após sua execução 17 EXERCÍCIOS Para cada uma das sentenças seguintes, escreva uma instrução que realize a tarefa indicada. Admita que as variáveis de ponto flutuante numero1 e numero2 foram declaradas e que numero1 foi inicializada com o valor 7.3. 18 EXERCÍCIOS Declare a variável fptr como ponteiro para um objeto do tipo float; Atribua o endereço da variável numero1 à variável de ponteiro fptr; Imprima o valor do objeto apontado por fptr; Atribua o valor do objeto apontado por fptr à variável número2; Imprima o valor de numero2; Imprima o endereço de numero1. Use o especificador de conversão %p; Imprima o endereço de armazenamento em fptr. Use o especificador de conversão %p. O valor impresso é igual ao endereço de numero1; 19 VETORES COMO PONTEIROS Ponteiros e vetores têm uma ligação muito forte; Quando você declara uma matriz da seguinte forma: O compilador em C calcula o tamanho, em bytes, necessário para armazenar a matriz 20 VETORES COMO PONTEIROS O compilador então aloca este número de bytes em um espaço livre de memória; O nome da variável que você declarou é na verdade um ponteiro para o tipo da matriz; Este ponteiro aponta para o primeiro elemento da matriz; Mas, como podemos usar a seguinte notação? 21 VETORES COMO PONTEIROS A notação anterior é absolutamente equivalente a se fazer: Fica claro, por exemplo, porque é que, no C, a indexação começa em 0; É porque, ao pegarmos o valor do primeiro elemento de um vetor, queremos de fato, *nome_da_variavel e então devemos ter um índice 0; 22 VETORES COMO PONTEIROS PROJETO 3 23 VETORES COMO PONTEIROS No projeto anterior, cada vez que se faz matrx[i][j] o programa tem que calcular o deslocamento para dar ao ponteiro; No segundo programa o único cálculo que deve ser feito é o de um incremento de ponteiro; Fazer 2500 incrementos em um ponteiro é muito mais rápido que calcular 2500 deslocamentos completos; 24 EXERCÍCIO 1 Escreva um programa que declare uma matriz 100 x 100 de inteiros. Você deve inicializar a matriz com zeros usando ponteiros para endereçar seus elementos. Preencha depois a matriz com os números de 10000 a 1, também usando ponteiros; 25 VETORES COMO PONTEIROS Há uma diferença entre o nome de um vetor e um ponteiro que deve ser frisada: Um ponteiro é uma variável, mas o nome de um vetor não é uma variável; Isto significa, que não se consegue alterar o endereço que é apontado pelo nome do vetor 26 VETORES COMO PONTEIROS 27 PONTEIROS COMO VETORES Sabemos que: O nome de um vetor é um ponteiro constante; Podemos indexar o nome de um vetor; Sendo assim, podemos indexar um ponteiro qualquer 28 PONTEIROS COMO VETORES Podemos ver que p[2] equivale a *(p+2) 29 STRINGS PROJETO 4 Seguindo o raciocínio, nomes de strings, são do tipo char*; 30 STRINGS Aspectos observados no projeto anterior: Podemos passar ponteiro como argumentos de funções. Passando o ponteiro você possibilita à função alterar o conteúdo da string; No comando while(*origem) estamos usando o fato de que a string termina em ‘\0’; Origem++ e destino++ não estamos alterando o valor do ponteiro base da string. No C são passados para as funções cópias dos argumentos; Quando alteramos o ponteiro origem o pontei- ro str2 permanece inalterado na função main; 31 EXERCÍCIO 2 Faça uma função StrLen e Strcat() que funcionem como as funções strlen e strcat da biblioteca string.h respectivamente;32 ENDEREÇOS DE ELEMENTOS DE VETORES A notação abaixo é válida: E retorna o endereço do ponto do vetor indexado por índice. Isto seria equivalente a nome_da_variável +índice; nome_da_variável tem o endereço de &nome_da_variável[0]; 33 VETORES DE PONTEIROS Podemos construir vetores de ponteiros; Uma declaração de um vetor de ponteiros inteiros poderia ser: No caso acima, pmatrx é um vetor que armazena 10 ponteiros para inteiros 34 PONTEIROS DE PONTEIROS Podemos declarar um ponteiro para um ponteiro com a seguinte notação: Algumas considerações: **nome_da_variável é o conteúdo final da variável apontada; *nome_da_variável é o conteúdo do ponteiro intermediário; Podemos fazer ****nome_da_variável ; 35 PROJETO 5 36 EXERCÍCIO Encontre o erro no programa abaixo e corrija-o para que escreva o número 10 na tela, através de q; 37 CUIDADOS A SEREM TOMADOS AO SE USAR PONTEIROS SAIBA SEMPRE PARA ONDE O PONTEIRO ESTÁ APONTANDO; NUNCA USE UM PONTEIRO QUE NÃO FOI INICIALIZADO 38 EXERCÍCIO 3 Escrever um programa para imprimir as matrizes declaradas abaixo utilizando ponteiros 39
Compartilhar