Baixe o app para aproveitar ainda mais
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.
Compartilhar