Buscar

Aula sobre Ponteiros e alocação dinâmica em C++

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

29 de maio de 2013
Ponteiros
Rossana Baptista Queiroz
Ponteiros
2
 Variáveis do tipo “ponteiro” armazenam endereços de 
memória
 Apontam para outra variáveis
 Permitem manipulações mais eficientes em estruturas de 
dados, principalmente estruturas dinâmicas
 Alocação de espaços de memória durante a execução do 
programa
 Notação:
 Referência direta: com a variável
 Referência indireta: com ponteiro
Ponteiros
 Exemplo:
12contador 
pcontador 0x0012ff7c
0x0012ff7c
int contador; //declara variável do tipo inteiro
int *pcontador; //declara variável ponteiro para inteiro
contador = 12; //atribui o valor 12 para contador
pcontador = &contador; //atribui o endereço da variável
//contador à variável pcontador
Ponteiros
 Outra maneira de enxergar:
12
12
contador
pcontador
contador referencia diretamente uma 
variável que contém o valor 12
O ponteiro pcontador referencia 
indiretamente uma variável que 
contém o valor 12
contador
Ponteiros
 Sintaxe básica 
 Declaração
 Atribuição
 Avaliação
Exemplo:
<tipo da variável> * <nome do ponteiro>;
<nome do ponteiro> = &<nome da variável>;
*<nome do ponteiro> //retorna (ou altera) o valor 
//armazenado no endereço indicado
cout << *pcontador;
aux = *pcontador + 5;
*pcontador = contador + 5;
Ponteiros
6
 Inicialização:
 NULL e 0 (zero)
 Um ponteiro com valor 0 ou NULL não aponta para nada e 
é conhecido como ponteiro nulo
 Exemplo:
 Endereço de uma variável do mesmo tipo
int *ptr;
ptr = NULL;
ptr = 0; Instruções equivalentes!
pcontador = &contador;
Ponteiros
 Exemplo 2:
cout << "Endereço: contador: " << &contador << endl;
cout << "Valor: pcontador: " << pcontador << endl;
cout << "Valor: contador: " << contador << endl;
cout << "Valor: *pcontador: " << *pcontador << endl;
Ponteiros
 Sintaxe : expressões e aritmética de ponteiros 
 Vetores: uso do nome equivale ao ponteiro para primeiro 
elemento
int v[5];
int *pv;
pv = v;
pv = &v[0]; Instruções equivalentes!
v[0] v[1] v[2] v[3] v[4]v
pv
Posição
3000 3004 3008 3012 3016
Não utilizamos o operador de 
endereço (&) diretamente em arrays, 
porque o nome do array é a posição 
na memória do array (isto é, um 
nome de array já é um ponteiro!
Ponteiros
 Sintaxe : expressões e aritmética de ponteiros 
 Aritmética: incremento/decremento apontam para próximos 
elementos 
pv = &v[0]; //aponta elemento inicial
pv ++; // aponta para o segundo;
pv = pv + 3; //aponta para o quinto elemento
v[0] v[1] v[2] v[3] v[4]v
Variável ponteiro pv
Posição
3000 3004 3008 3012 3016
v[0] v[1] v[2] v[3] v[4]v
Variável ponteiro pv
Posição
3000 3004 3008 3012 3016
v[0] v[1] v[2] v[3] v[4]v
Variável ponteiro pv
Posição
3000 3004 3008 3012 3016
Passagem de Argumentos para funções 
por referência com Ponteiros
10
 Lembram-se?
 Passagem por valor 
 Cópia do valor da variável, outro endereço
 Passagem por referência
 Passagem do endereço da variável através de uma referência
 A referência &<nome_variavel> é um nome alternativo (alias) para 
uma variável. Referencia um mesmo espaço de memória (tem o 
mesmo endereço)
 Exemplo:
int x;
int& rx = x; //referência precisa ser inicializada com uma variável
x = 13;
rx = 42; // A atribuição é automaticamente aplicada em x.
Passagem de Argumentos para funções 
por referência com Ponteiros
11
 Lembram-se?
int quadrado_de( int x)
{
x = x * x;
return (x);
}
int main()
{
int nro, q;
cout << "digite um nro: ";
cin >> nro;
q = quadrado_de(nro);
return (0);
}
Passagem por valor
int quadrado_de( int &x)
{
x = x * x;
return (x);
}
int main()
{
int nro, q;
cout << "digite um nro: ";
cin >> nro;
q = quadrado_de(nro);
return (0);
}
Passagem por referência
Passagem de Argumentos para funções 
por referência com Ponteiros
12
 3ª alternativa (NOVO*!)
 Passar por referência com argumentos de ponteiro
void quadrado_de (int *ponteiro)
{
*ponteiro = *ponteiro * *ponteiro; //eleva *ponteiro ao quadrado
}
int main()
{
int numero = 5;
quadrado_de(&numero); //o endereço de numero é passado para a função
...
}
Operador aritmético *
Operador de indireção *
É assim que fazemos passagem por referência em C, pois C não possui referências
*não visto em aula, ainda
Alocação dinâmica
13
 Até agora, utilizamos arrays estáticos (numero de 
elementos constante, declarados com a variável)
 int numeros[10];
 char palavra[12];
 Desvantagem?
 Desperdício de memória
 Ex.: char nome[50];
Alocação Dinâmica
14
 O que não podemos fazer com arrays estáticos...
#include <iostream>
using namespace std;
int main ()
{
int numeroValores;
cout << "Digite o numero de valores:";
cin >> numeroValores;
int valores[numeroValores];
return 0;
}
A razão da exigência de ter uma constante (ou literal) é que vamos alocar memória 
para o array na altura da compilação, e o compilador necessita de saber 
exatamente a quantidade de memória que deve reservar
Alocação Dinâmica
15
 Reformulando o exemplo anterior com dados 
dinâmicos
#include <iostream>
using namespace std;
int main ()
{
int numeroValores;
cout << "Digite o numero de valores:";
cin >> numeroValores;
int *valores = new int[numeroValores]; //aloca um array de numeroValores elementos 
...
delete [] valores; //libera a memória alocada 
return 0;
}
Arrays de Ponteiros
16
 Estáticos ou dinâmicos
 int *tabela[100]; //matriz de 100 “linhas”, e cada 
“coluna” deve ser alocada dinamicamente ou receber 
endereços para outros int* (pode conter arrays, 
inclusive)
 int **tabela; //matriz em que as “linhas” e “colunas” 
deverão ser alocados dinamicamente
Arrays de Ponteiros
17
 Exemplos para visualizar:
 Arrays de palavras
 Array de listas com tamanhos diferentes
char *naipe[4] = { "Copas","Espadas","Paus","Ouros" };
int *numeros = {1, 2, 3, 4, 5};
int numeros[5] = {1, 2, 3, 4, 5};
int outros_numeros[3] = {1, 2, 3};
int *listas_de_numeros[2];
listas_de_numeros[0] = numeros;
listas_de_numeros[1] = outros_numeros;
Arrays de Ponteiros
18
 Exemplos para visualizar:
 Percorrendo o array de listas com tamanhos diferentes
int numeros[5] = {1, 2, 3, 4, 5};
int outros_numeros[3] = {1, 2, 3};
int *listas_de_numeros[2];
listas_de_numeros[0] = numeros;
listas_de_numeros[1] = outros_numeros;
for (int i=0; i<5; i++)
cout << listas_de_numeros[0][i] << " ";
cout << "\n";
for (int i=0; i<3; i++)
cout << listas_de_numeros[0][i] << " ";
cout << "\n";
Exercício
Considerando um vetor de elementos quaisquer, utilize ponteiros para 
realizar uma busca neste vetor, até encontrar e manipular o elemento 
procurado.
T e s t a n d o 0
char v[30];
char *pv;
...
pv = v; // ou pv = &v[0];
while ( ((*pv) != 'a') && ((*pv) != 0) ) pv ++;
if (*pv == 0) cout << "Não achei...";
else cout << "achei o valor: " << *pv;
+ exercícios
20
 Escrever um programa para alocar dinamicamente um 
vetor de inteiros, preencher este vetor com valores lidos 
do teclado e, por último, escrever o vetor
 Completar este programa ( sempre usando ponteiros) 
para informar ao usuário:
 o maior valor no vetor;
 o menor valor no vetor;
 o valor médio armazenado no vetor;
 e o número de valores negativos no vetor;
 imprimir os elementos em ordem contrária
+ exercícios
21
 Escreva uma função CALCULA que: 
 receba como parâmetros duas variáveis inteiras, X eY; 
 retorne em X a soma de X e Y; 
 retorne em Y a subtração de X e Y.

Outros materiais