Ponteiros

Embed Size (px)

DESCRIPTION

Side Ponteiros e Variaveis.

Citation preview

  • Laboratrio de programao III Linguagem CTrabalhando com ponteiros

    linguagem

    RoteiroConsideraes sobre a memriaVariveis versus memriaPonteirosAritmtica de ponteiros

    linguagem

    Consideraes sobre a memriaO computador possui uma grande capacidade de memria RAM, que o programador pode utilizar em seus programas.Por ser muito grande, vamos utilizar um pedao, um trecho, de memria como exemplo.

    linguagem

    Consideraes sobre a memria

    linguagem

    Variveis versus memriaQuando voc declara uma varivel, o compilador reserva uma regio de memria para ela.Essa regio de memria reservada de acordo com o tamanho do tipo de dado para o qual a varivel foi declarada.

    linguagem

    Variveis versus memriaPortanto, cada varivel fica em um endereo de memria diferente;Quando fazemos uma atribuio a uma varivel, o valor atribudo colocado na regio de memria que foi reservada para ela.char c;regio de memria alocada para a varivel c (char).

    linguagem

    PonteirosSendo assim, ns podemos manipular o contedo de uma varivel utilizando ela mesmo ou utilizando o seu endereo.A linguagem C oferece um tipo especial de varivel chamado ponteiro. Os ponteiros so variveis que armazenam endereos de outras variveis.

    linguagem

    Declarando ponteirosOs ponteiros so iguais s variveis comuns. A nica diferena est no fato dele armazenar um endereo, e no um dado ou valor.Para informar que voc quer declarar um ponteiro, e no uma varivel comum, coloque o smbolo de asterisco ao lado do tipo da varivel:

    char* ponteiro;

    O smbolo de asterisco que vai indicar ao c que voc quer um ponteiro e no uma varivel comum. Fora esse detalhe, a declarao idntica a de uma varivel comum.

    linguagem

    Declarando ponteirosPara cada tipo de varivel h um ponteiro especfico. Isso significa que se voc vai armazenar o endereo de uma varivel do tipo int, deve criar um ponteiro para int (que int*). Se for char, um ponteiro para char (char*).

    char* pc;

    No exemplo acima, o C vai saber que voc est criando uma varivel chamada pc que vai armazenar endereos de variveis do tipo char.

    int* pn;

    No exemplo acima, o C vai saber que voc est criando uma varivel chamada pn que vai armazenar endereos de variveis do tipo int.

    linguagem

    Declarando ponteirosAlguns exemplos:

    TipoVarivel comumPonteiro p/o tipocharchar letra;char* pontLetra;intint numero;int* pontNumero;floatfloat num;float* pontNum;

    linguagem

    Utilizando ponteirosUtilizar um ponteiro simples. Como qualquer varivel, para colocar um valor dentro dela, basta atribu-lo:

    char* ponteiro = 10030; // coloca o endereo 10030 no ponteiro

    Porm, os ponteiros so mais utilizados para armazenar o endereo de outras variveis:

    char c = A; // coloca o valor A na varivel cchar* ponteiro = &c; // coloca o endereo da varivel c no ponteiro

    Note que o operador & (que retorna o endereo de uma varivel) foi utilizado!

    OBS: A princpio, voc no pode atribuir endereos de variveis que no sejam do mesmo tipo do ponteiro: int a = 20;char* pont = &a; // Errado, pois a no do tipo char!

    linguagem

    Utilizando ponteirosSe voc mandar imprimir uma varivel do tipo ponteiro, ela vai mostrar o endereo armazenado nela:

    char c = A; // coloca o valor A na varivel cchar* ponteiro = &c; // coloca o endereo da varivel c no ponteiroprintf(%d, ponteiro); // imprime o contedo do ponteiro, que o // endereo da varivel c

    Trecho de memriaA1hA2hA3hA4hA5hAVarivel c (contendo o valor A)A1hVarivel ponteiro (contendo o endereo A1h)

    linguagem

    Utilizando ponteirosVoc pode utilizar o ponteiro para mostrar ou manipular o contedo do endereo (da varivel) que ele aponta. Para fazer isso, voc deve utilizar o operador * :

    char c = A; // coloca o valor A na varivel cchar* ponteiro = &c; // coloca o endereo da varivel c no ponteiroprintf(%d, *ponteiro); // imprime o contedo do endereo para o qual // o ponteiro aponta ( que A )

    Trecho de memriaA1hA2hA3hA4hA5hAVarivel c (contendo o valor A)A1hVarivel ponteiro (contendo o endereo A1h)

    linguagem

    Trecho de memriaA1hA2hA3hA4hA5hAVarivel c (contendo o valor A)A1hVarivel ponteiro (contendo o endereo A1h)Utilizando ponteirosPonteiros tambm tm endereo. Logo, voc tambm pode imprimir o seu endereo ou armazen-lo ou utiliz-lo em um outro ponteiro:

    char c = A; // coloca o valor A na varivel cchar* ponteiro = &c; // coloca o endereo da varivel c no ponteiroprintf(%d, &ponteiro); // imprime o endereo do ponteiro (A2h)char** p2 = &ponteiro; // cria um ponteiro de ponteiro, e coloca o // endereo do ponteiro l

    linguagem

    Aritmtica de ponteirosAo incrementar o p, a linguagem C identifica primeiramente qual o tipo do ponteiro. Da, incrementa o endereo que ele contm, de acordo com o tamanho do seu tipo.p++;Assim como nas variveis comuns, voc pode realizar operaes matemticas com os endereos armazenados em ponteiros:char* p; char c[5];p = &c[0]; // p recebe o endereo do 1o c

    linguagem

    Deste modo, voc pode fazer um programa que preenche o vetor sem ter que utilizar a varivel do vetor (varivel c):

    void main(void) { char* p; char c[5]; p = c; // o mesmo que p = &c[0] for(int cont=0;cont