14.03.2015 Views

Apostila C da UFMG - Universidade do Minho

Apostila C da UFMG - Universidade do Minho

Apostila C da UFMG - Universidade do Minho

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

6 - Ponteiros<br />

6.1 - Como Funcionam os Ponteiros<br />

Os ints guar<strong>da</strong>m inteiros. Os floats guar<strong>da</strong>m números de ponto flutuante. Os chars guar<strong>da</strong>m caracteres. Ponteiros<br />

guar<strong>da</strong>m endereços de memória. Quan<strong>do</strong> você anota o endereço de um colega você está crian<strong>do</strong> um ponteiro. O<br />

ponteiro é este seu pe<strong>da</strong>ço de papel. Ele tem anota<strong>do</strong> um endereço. Qual é o senti<strong>do</strong> disto? Simples. Quan<strong>do</strong> você<br />

anota o endereço de um colega, depois você vai usar este endereço para achá-lo. O C funciona assim. Voce anota o<br />

endereço de algo numa variável ponteiro para depois usar.<br />

Da mesma maneira, uma agen<strong>da</strong>, onde são guar<strong>da</strong><strong>do</strong>s endereços de vários amigos, poderia ser vista como sen<strong>do</strong> uma<br />

matriz de ponteiros no C.<br />

Um ponteiro também tem tipo. Veja: quan<strong>do</strong> você anota um endereço de um amigo você o trata diferente de quan<strong>do</strong><br />

você anota o endereço de uma firma. Apesar de o endereço <strong>do</strong>s <strong>do</strong>is locais ter o mesmo formato (rua, número, bairro,<br />

ci<strong>da</strong>de, etc.) eles indicam locais cujos conteú<strong>do</strong>s são diferentes. Então os <strong>do</strong>is endereços são ponteiros de tipos<br />

diferentes.<br />

No C quan<strong>do</strong> declaramos ponteiros nós informamos ao compila<strong>do</strong>r para que tipo de variável vamos apontá-lo. Um<br />

ponteiro int aponta para um inteiro, isto é, guar<strong>da</strong> o endereço de um inteiro.<br />

6.2 - Declaran<strong>do</strong> e Utilizan<strong>do</strong> Ponteiros<br />

Para declarar um ponteiro temos a seguinte forma geral:<br />

tipo_<strong>do</strong>_ponteiro *nome_<strong>da</strong>_variável;<br />

É o asterisco (*) que faz o compila<strong>do</strong>r saber que aquela variável não vai guar<strong>da</strong>r um valor mas sim um endereço para<br />

aquele tipo especifica<strong>do</strong>. Vamos ver exemplos de declarações:<br />

int *pt;<br />

char *temp,*pt2;<br />

O primeiro exemplo declara um ponteiro para um inteiro. O segun<strong>do</strong> declara <strong>do</strong>is ponteiros para caracteres. Eles<br />

ain<strong>da</strong> não foram inicializa<strong>do</strong>s (como to<strong>da</strong> variável <strong>do</strong> C que é apenas declara<strong>da</strong>). Isto significa que eles apontam para<br />

um lugar indefini<strong>do</strong>. Este lugar pode estar, por exemplo, na porção <strong>da</strong> memória reserva<strong>da</strong> ao sistema operacional <strong>do</strong><br />

computa<strong>do</strong>r. Usar o ponteiro nestas circunstânicias pode levar a um travamento <strong>do</strong> micro, ou a algo pior. O ponteiro<br />

deve ser inicializa<strong>do</strong> (aponta<strong>do</strong> para algum lugar conheci<strong>do</strong>) antes de ser usa<strong>do</strong>! Isto é de suma importância!<br />

Para atribuir um valor a um ponteiro recém-cria<strong>do</strong> poderíamos igualá -lo a um valor de memória. Mas, como saber a<br />

posição na memória de uma variável <strong>do</strong> nosso programa? Seria muito difícil saber o endereço de ca<strong>da</strong> variável que<br />

usamos, mesmo porque estes endereços são determina<strong>do</strong>s pelo compila<strong>do</strong>r na hora <strong>da</strong> compilação e realoca<strong>do</strong>s na<br />

execução. Podemos então deixar que o compila<strong>do</strong>r faça este trabalho por nós. Para saber o endereço de uma variável<br />

basta usar o opera<strong>do</strong>r &. Veja o exemplo:<br />

int count=10;<br />

int *pt;<br />

pt=&count;<br />

Criamos um inteiro count com o valor 10 e um aponta<strong>do</strong>r para um inteiro pt. A expressão &count nos dá o endereço<br />

de count, o qual armazenamos em pt. Simples, não é? Repare que não alteramos o valor de count, que continua<br />

valen<strong>do</strong> 10.<br />

Como nós colocamos um endereço em pt, ele está agora "libera<strong>do</strong>" para ser usa<strong>do</strong>. Podemos, por exemplo, alterar o<br />

valor de count usan<strong>do</strong> pt. Para tanto vamos usar o opera<strong>do</strong>r "inverso" <strong>do</strong> opera<strong>do</strong>r &. É o opera<strong>do</strong>r *. No exemplo<br />

acima, uma vez que fizemos pt=&count a expressão *pt é equivalente ao próprio count. Isto significa que, se<br />

quisermos mu<strong>da</strong>r o valor de count para 12, basta fazer *pt=12.<br />

Vamos fazer uma pausa e voltar à nossa analogia para ver o que está acontecen<strong>do</strong>.<br />

Digamos que exista uma firma. Ela é como uma variável que já foi declara<strong>da</strong>. Você tem um papel em branco onde vai<br />

anotar o endereço <strong>da</strong> firma. O papel é um ponteiro <strong>do</strong> tipo firma. Você então liga para a firma e pede o seu endereço,<br />

o qual você vai anotar no papel. Isto é equivalente, no C, a associar o papel à firma com o opera<strong>do</strong>r &. Ou seja, o<br />

opera<strong>do</strong>r & aplica<strong>do</strong> à firma é equivalente a você ligar para a mesma e pedir o endereço. Uma vez de posse <strong>do</strong><br />

endereço no papel você poderia, por exemplo, fazer uma visita à firma. No C você faz uma visita à firma aplican<strong>do</strong> o<br />

opera<strong>do</strong>r * ao papel. Uma vez dentro <strong>da</strong> firma você pode copiar seu conteú<strong>do</strong> ou modificá-lo.<br />

Uma observação importante: apesar <strong>do</strong> símbolo ser o mesmo, o opera<strong>do</strong>r * (multiplicação) não é o mesmo opera<strong>do</strong>r<br />

que o * (referência de ponteiros). Para começar o primeiro é binário, e o segun<strong>do</strong> é unário pré-fixa<strong>do</strong>.<br />

Pág. 40

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!