Você está na página 1de 6

PONTEIROS Definio: um ponteiro uma varivel que contm o endereo de uma outra varivel.

. Toda varivel declarada em um programa tem um endereo de memria alocado para si e o nmero de posies de memria alocado depende do seu tipo (como j foi visto). Ponteiros podem apontar (receber o endereo) para variveis de qualquer um dos tipos disponveis na linguagem. Variveis possuem nomes, endereos e contedos. Quando se conhece o nome da varivel, pode-se acess-la atravs do nome. Eventualmente, possumos apenas o endereo de uma varivel e, para acess-la, precisamos utilizar os ponteiros. Ponteiros so importantes para: alocao dinmica de memria, passagem de parmetros para funes, entre outras. Declarao: se uma varivel vai conter um ponteiro (endereo), ela deve ser declarada como tal. Uma declarao de ponteiro consiste no tipo base, um * e o nome da varivel. Forma Geral: < tipo > * < nome_do_ponteiro > ; Exemplo: int valor, *ponteiro_valor;
No exemplo, ponteiro_valor ser usado para apontar para uma varivel do tipo inteiro. Um ponteiro no deve apontar para uma varivel que no seja do seu tipo base.

O operador &: O operador endereo & usado para indicar o endereo de uma varivel. Sempre que desejamos fazer um ponteiro apontar (receber o endereo) para uma varivel temos que usar este operador.
Ex.: ... ponteiro_valor = &valor; ... No exemplo acima, a varivel ponteiro ponteiro_valor recebe o endereo da varivel valor, ou seja, aps esta atribuio o ponteiro ponteiro_valor estar apontando para a varivel valor. Para se chegar ao contedo realmente armazenado na varivel valor, atravs de seu ponteiro, deve-se usar agora o operador * , que significa: o valor no endereo. Ex.: ... int valor, valor_aux, *ponteiro_valor; valor = 10; ponteiro_valor = &valor; valor_aux = *ponteiro_valor; printf( Valor armazenado: %d \n, valor_aux); /* ou printf( Valor armazenado: %d \n, *ponteiro_valor); */ Como ponteiros so variveis (que ao invs de conter valores, contm endereos) podemos atribuir ponteiros para ponteiros como fazemos com variveis comuns.

Ex.: ... int valor, *ponteiro_valor, *ponteiro_novo; valor = 10; ponteiro_valor = &valor; ponteiro_novo = ponteiro_valor; printf(Valor armazenado: %d \n, *ponteiro_novo); ... No exemplo acima, ponteiro_novo passa a apontar para o mesmo endereo para o qual aponta ponteiro_valor (recebe o endereo que est dentro de ponteiro_valor).

RESUMO: Declarao, operador &, operador * e atribuio.


-- a05a.c

Operaes Aritmticas com Ponteiros: possvel realizar adio e subtrao sobre ponteiros buscando-se endereos de memria (apontando-se para valores) que estejam acima (adio) ou abaixo (subtrao) do endereo atual contido no ponteiro.
Por exemplo, para um ponteiro de nome p, a operao p++ faz com que p passe a apontar para o prximo elemento, qualquer que seja o tipo de objeto para o qual p aponta. J p += i (p = p + i), faz com que p passe a apontar i elementos alm (acima) do objeto para o qual p aponta atualmente. Ex.: main () { int *ponteiro, vetor_inteiros[4] = {0, 10, 20, 30}; ponteiro = &vetor_inteiros[0]; ponteiro+= 2; /* igual a: ponteiro = &vetor_inteiros[2]; */ printf(Valor apontado: %d \n, *ponteiro); ... } No exemplo, ponteiro aponta para o primeiro elemento do vetor vetor_inteiros. A soma ponteiro+= 2 faz com que ponteiro passe a apontar 2 elementos acima do valor atual (no caso para o valor inteiro 20).

IMPORTANTE RESSALTAR QUE O COMPILADOR

AUTOMATICAMENTE RECONHECE O TIPO EXEMPLO, A SOMA

BSICO DO PONTEIRO E PULA CAUSOU UM SALTO DE

A QUANTIDADE DE ENDEREOS RESPECTIVOS. NO 4 OU 8 ENDEREOS ( TAMANHO EM BYTES DE UM INT).

-- a05b.c

Inicializao de Ponteiros: Como ponteiros tambm so variveis, muitas vezes preciso inicializ-los a fim de evitar valores iniciais inconsistentes (lixos j existentes na memria).

Para ponteiros costuma-se usar a constante NULL, predefinida pela linguagem, que contm o valor zero. Ex.: ... int *ponteiro_val = NULL; ...

Vetores e Ponteiros: A forma de acesso a vetores, vista anteriormente, usava um ndice (vetores unidimensionais) para acessar cada elemento do vetor. Entretanto, COMO O NOME DE UM VETOR , NA REALIDADE, UM PONTEIRO PARA O PRIMEIRO ELEMENTO DO VETOR DECLARADO (ARMAZENA O ENDEREO DO INCIO DOS DADOS DO VETOR NA MEMRIA), pode-se usar este nome (ponteiro) como uma forma de acesso alternativa e mais gil que a usual (via ndices).
Ex.: Para acessar o primeiro elemento de um vetor de nome valores: elem = valores[0]; ou elem = *valores; Para acessar o segundo elemento: elem = valores[1]; ou elem = *(valores + 1); Pode-se acessar tambm cada elemento de um vetor atravs de um ponteiro auxiliar como foi visto na seo anterior ( exemplo a05b.c). Importante: NO se deve executar operaes aritmticas que alterem o valor no nome do vetor, pois, caso contrrio, o endereo de incio do vetor na memria ser perdido. Exemplo: NO SE FAZ valores = valores + 2. Para este tipo de situao, usa-se um ponteiro auxiliar.

RESUMO: Aritmtica de ponteiros, inicializao de ponteiros, e vetores e ponteiros.


-- a05c.c

Exerccios resolvidos sobre ponteiros:


1. Escrever um programa para alocar dinamicamente um vetor de inteiros, preencher este vetor com valores lidos do teclado e, por ltimo, escrever o vetor. #include #include #include #include <stdio.h> <conio.h> <alloc.h> <stdlib.h>

void main() { int tam, * pt_aux, * vet; int i; char aux [ 10]; printf ( "Entre com o numero de elementos do vetor: "); gets ( aux); tam = atoi ( aux); vet = ( int *) malloc ( tam * sizeof ( int)); pt_aux = vet; for ( i = 0; i < tam; i ++) { printf ( "Entre com o valor do elemento %d: ", i); gets ( aux); * pt_aux ++ = atoi ( aux); } printf ( "\n"); pt_aux = vet; for ( i = 0; i < tam; i ++) { printf ( "O valor do elemento %d eh: %d\n", i, * pt_aux + } free ( vet); } getch ( );

+);

Completar este programa ( sempre usando ponteiros) para informar ao usurio: o maior valor no vetor; o menor valor no vetor; o valor mdio armazenado no vetor; e o nmero de valores negativos no vetor. 2. Escrever um programa para imprimir, do ltimo para o primeiro, cada um dos elementos do vetor do exemplo a05b.c, atravs do mesmo ponteiro auxiliar pt. 3. Escrever um programa para ler uma frase qualquer do teclado e imprimir, esta mesma frase, um caracter por vez. #include <stdio.h> #include <conio.h> #include <alloc.h>

#include <stdlib.h> void main() { char frase [ 255], * aux; printf ( "Entre com uma frase qualquer: "); gets ( frase); aux = frase; while ( * aux) printf ( "%c", * aux ++); printf ( "\n"); } getch ( );

Completar este programa ( sempre usando ponteiros) para: imprimir a frase ao contrrio; contar o nmero de espaos em branco na frase.

Exerccios propostos sobre ponteiros:


1. Escrever um programa para imprimir as matrizes declaradas abaixo utilizando ponteiros. #include <stdio.h> main ( ) { int vetor [ 5] = { 0, 1, 2, 3, 4}; int matriz [ 5] [ 5] = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, char string [ 10] = "BICAMPEAO"; }

0, 1, 2, 3, 4};

2. Escrever um programa para alocar dinamicamente uma rea de memria para N doubles, preencher esta rea com valores lidos do teclado e, por ltimo, proporcionar uma consulta aos dados gravados. A consulta deve receber um nmero, que corresponde a uma das posies da rea alocada, e o valor double armazenado naquela posio deve ser apresentado ao usurio. O programa deve fazer uma consistncia no nmero informado, correspondente posio, e apresentar uma mensagem de erro se ele estiver aqum ou alm dos limites da rea de memria. 3. Escrever um programa para alocar uma rea de memria para armazenar 3 valores float e 3 caracteres, preencher esta rea com dados provenientes do teclado e, por ltimo, apresent-los do ltimo at o primeiro, isto , de maneira inversa quela do armazenamento. 4. Escrever um programa que recebe um nome completo e, posteriormente, armazena-o numa rea de memria alocada dinamicamente. O tamanho desta rea deve ser exatamente o necessrio para armazenar corretamente o nome informado. Por ltimo, o nome armazenado na rea alocada deve ser impresso (usar %s no printf).

5. Escrever um programa que recebe o nome de uma disciplina do curso de Engenharia e um caracter avulso. O programa deve informar o endereo da primeira ocorrncia deste caracter no nome da disciplina (usar %x no printf). Igualmente, deve ser dada uma notificao caso o caracter no seja encontrado.

Você também pode gostar

  • LFA Aula06 Exercicios
    LFA Aula06 Exercicios
    Documento20 páginas
    LFA Aula06 Exercicios
    Luan Lacerda
    Ainda não há avaliações
  • Instalação
    Instalação
    Documento1 página
    Instalação
    Luan Lacerda
    Ainda não há avaliações
  • Imprimir 13-22
    Imprimir 13-22
    Documento37 páginas
    Imprimir 13-22
    Luan Lacerda
    Ainda não há avaliações
  • Analise Estruturada
    Analise Estruturada
    Documento20 páginas
    Analise Estruturada
    sbarzi
    Ainda não há avaliações
  • Proxy
    Proxy
    Documento6 páginas
    Proxy
    Luan Lacerda
    Ainda não há avaliações
  • Parte 1
    Parte 1
    Documento11 páginas
    Parte 1
    polisolvente
    Ainda não há avaliações
  • Apostila CPP
    Apostila CPP
    Documento59 páginas
    Apostila CPP
    araujo_leo217912
    Ainda não há avaliações