Você está na página 1de 39

Ponteiros

BCC702-Programao de Computadores II
Emiliana Mara Lopes Simes simoes.eml@gmail.com

Universidade Federal de Ouro Preto maro 2010

Ponteiros

Denio: Um ponteiro uma varivel que contm um endereo de memria como valor. Normalmente trata-se do endereo de outra varivel na memria Observaes:
Uma varivel faz referncia direta para um valor especco Um ponteiro contm o endereo de uma varivel que possui um valor armazenado

Ponteiros

Ponteiros

Estrutura geral de uma declarao de ponteiro: <tipo> *<nome_da_variavel>; Exemplos:


Declarando um ponteiro para um tipo int: int *ptr; Declarando um ponteiro para um tipo double e declarando uma varivel double: oat *ptr, numero; Declarando e inicializando um ponteiro para um tipo int: int *ptr1 = NULL;

Ponteiros

Ateno Ponteiros apontam para variveis do mesmo tipo. Isto , ponteiro para um int aponta para o endeo de um nmero inteiro (int) Inicialize os ponteiros para evitar resultados indesejados (importantssimo!!!) Um ponteiro com o valor 0 ou NULL no aponta para NADA (Ponteiro nulo)

Ponteiros

Razes para o bom entendimento da utilizao de ponteiros:


Aumenta a ecincia do cdigo (mais rpido!); Utilizado para que funes modiquem os valores de seus argumentos; Usados em rotinas que trabalham com alocao dinmica de memria

Ateno A manipulao de ponteiros requer muito cuidado!

Operadores de Ponteiros

& (operador de endereo): Operador unrio que retorna o endereo de memria do seu operando Exemplo:

int x = 0; //declara a varivel x int *px; px = &x; //declara um ponteiro para inteiro /* coloca em px o endereo de memria da varivel x */

Operadores de Ponteiros

Operadores de Ponteiros
Ateno: O operador & no pode ser aplicado a expresses e constantes Exemplos:

int x = 0; int *px; px = &(x + 1); //Errado! px = &3; //Errado!

Operadores de Ponteiros
* (operador de indireo): Operador unrio que manipula um ponteiro. Retorna um sinnimo para a varivel apontada Exemplo:

int x = 0; //declara a varivel x int *px; px = &x; //declara um ponteiro para inteiro /* coloca em px o endereo de memria da varivel x */ /* atualiza o valor armazenado na varivel x para 10 */

(*px) = 10;

Passagem de ponteiro como argumento de uma funo

Se uma funo deseja alterar variveis da funo chamadora, podemos usar ponteiros

NO QUADRO: Funo que calcula o cubo de um valor

Alocao dinmica de memria

A alocao dinmica de memria permite ao programador o controle total sobre o tempo de vida das variveis Atravs dos operadores new e delete, o programador consegue criar e destruir (respectivamente) variveis de um determinado tipo Ao criar uma nova varivel com o operador new esta varivel no est sujeita s regras de escopo das variveis locais. A varivel criada com o operador new apenas pode ser destruda atravs do operador delete

Alocao dinmica de memria

O operador new pode ser usado para alocar dinamicamente memria para:
1 2 3

Tipos bsicos (int, double, char... etc) Vetores Tipos denidos pelo usurio (Classes)

Alocao dinmica de memria


Exemplo 1: Alocao dinmica de memria para um tipo bsico int main(){ int *x; x = new int; //aloca memria para um inteiro *x = 10; cout<<*x<<endl; delete x; //desaloca memria system(pause); return 0; }

Alocao dinmica de memria

O operador new recebe como parmetro o tipo de dados da varivel que se quer criar e devolve um ponteiro para a nova varivel criada Ao operador delete passado o ponteiro para uma varivel criada com o operador new (o que destrudo o apontado pelo ponteiro e no o prprio ponteiro!)

Alocao dinmica de memria


Exemplo 2: Alocao dinmica de memria para um vetor de inteiros de 5 elementos
int main(){ int *y; y = new int[ 5 ]; for(int i=0; i < 5; i++) y[i] = i; for(int i=0; i < 5; i++) cout<<y[i]<< ; delete y; //ERRO: Desaloca a memria //apenas do primeiro elemento do array system(pause); return 0; }

Alocao dinmica de memria


Exemplo 3: Alocao dinmica de memria para um vetor de inteiros de 5 elementos
int main(){ int *y; y = new int[ 5 ]; for(int i=0; i < 5; i++) y[i] = i; for(int i=0; i < 5; i++) cout<<y[i]<< ; delete [] y; //CORRETO system(pause); return 0; }

Alocao dinmica de memria: Tipo denido pelo usurio


Classe Data: Criar uma classe para representar uma data qualquer no formato: dia/ms/ano
class Data{ public: Data(); Data(int d, int m, int a); void print(); void setData(int d, int m, int a); private: int dia; int mes; int ano; }; Arquivo: Data.h

Alocao dinmica de memria: Tipo denido pelo usurio


#include Data.h #include <iostream> #include <iomanip> using namespace std; void Data::setData(int d, int m, int a){ //insere dia if(d > 0 && d <= 31) dia = d; else{ cout<<Dia invalido. Transformado em 1<<endl; dia = 1; } ... Arquivo: Data.cpp

Alocao dinmica de memria: Tipo denido pelo usurio


... //insere ms if(m > 0 && m <= 12) mes = m; else{ cout<<Mes invalido. Transformado em 1<<endl; mes = 1; } //insere ano if(a >= 0) ano = a; else{ cout<<Ano invalido. Transformado em 0<<endl; ano = 0; } } Arquivo: Data.cpp

Alocao dinmica de memria: Tipo denido pelo usurio

Data::Data(){ setData(1, 1, 0); } Data::Data(int d, int m, int a){ setData(d, m, a); } void Data::print(){ cout<<setw(2)<<setfill(0)<<dia <</<<setw(2)<<mes<</<<ano<<endl; } Arquivo: Data.cpp

Alocao dinmica de memria: Tipo denido pelo usurio

#include <iostream> #include Data.h using namespace std; int main() { Data *d = new Data; d->print(); delete d; system(PAUSE); return 0; } Arquivo: Principal.cpp

Alocao dinmica de memria: Tipo denido pelo usurio

Sada: 01/01/0 Press any key to continue...

Alocao dinmica de memria: Tipo denido pelo usurio

#include <iostream> #include Data.h using namespace std; int main() { Data *d = new Data(5, 10, 2009); d->print(); delete d; system(PAUSE); return 0; } Arquivo: Principal.cpp

Alocao dinmica de memria: Tipo denido pelo usurio

Sada: 05/10/2009 Press any key to continue...

Vetor de ponteiros para objetos do tipo Data


#include <iostream> #include Data.h using namespace std; int main(){ Data *vet[10]; //vetor de ponteiros do tipo Data int i; for(i=0; i < 10; i++) vet[i] = new Data(i+1,1,2010); for(i=0; i < 10; i++) vet[i]->print(); for(i=0; i < 10; i++) delete vet[i]; system(PAUSE); return 0; }

Vetor de ponteiros para objetos do tipo Data

Sada: 01/01/2010 02/01/2010 03/01/2010 04/01/2010 05/01/2010 06/01/2010 07/01/2010 08/01/2010 09/01/2010 10/01/2010 Press any key to continue...

Mtodo Destrutor

O destrutor um mtodo especial chamado quando um objeto da classe destrudo. Ele possui as seguintes propriedades: Tem o mesmo nome da classe precedido por ~ ; No tem valor de retorno, nem mesmo void; No possui parmetros; Uma classe s pode ter um destrutor.

Mtodo Destrutor
Mtodo Destrutor para a classe Data
class Data{ public: Data(); Data(int d, int m, int a); ~Data(); //destrutor void print(); void setData(int d, int m, int a); private: int dia; int mes; int ano; }; Arquivo: Data.h

Mtodo Destrutor

... Data::~Data(){ cout<<Destrutor Data... << endl; } ...

Arquivo: Data.cpp

Mtodo Destrutor

#include <iostream> #include Data.h using namespace std; int main() { Data *d = new Data; d->print(); delete d; system(PAUSE); return 0; } Arquivo: Principal.cpp

Mtodo Destrutor

Sada: 01/01/0 Destrutor Data... Press any key to continue...

Mtodo Destrutor

O destrutor pode ser usado, por exemplo, para desalocar memria que foi alocada dinamicamente na classe

Exemplo: Mtodo Destrutor


Implementao da classe Evento. Um evento tem uma data de realizao e um nome.
#include <string> #include Data.h using namespace std; class Evento{ public: Evento(string n, int d, int m, int a); ~Evento(); //destrutor void print(); private: Data *data; //ponteiro para um tipo Data string nome; }; Arquivo: Evento.h

Exemplo: Mtodo Destrutor


#include Evento.h #include <iostream> Evento::Evento(string n, int d, int m, int a){ nome = n; data = new Data(d, m, a); //alocao dinmica de memria } Evento::~Evento(){ cout<<\n\nDestrutor Evento...\n; delete data; //desalocao de memria alocada com new } void Evento::print(){ cout << Evento: << nome data->print(); }

<< endl;

Arquivo: Evento.cpp

Exemplo: Mtodo Destrutor

#include <iostream> #include Evento.h using namespace std; int main() { Evento *e = new Evento(Carnaval, 16, 2, 2010); e->print(); delete e; system(PAUSE); return 0; } Arquivo: Principal.cpp

Exemplo: Mtodo Destrutor

Sada: Evento: Carnaval 16/02/2010 Destrutor Evento... Destrutor Data... Press any key to continue...

Dvidas?

Prxima Aula

Aula tira dvidas

Você também pode gostar