Ponteiros
-
Upload
thiagosodre -
Category
Documents
-
view
6 -
download
0
description
Transcript of Ponteiros
-
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