<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Blog of a WebDeveloper &#187; C</title>
	<atom:link href="http://joaopedropereira.com/blog/category/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://joaopedropereira.com/blog</link>
	<description>Um novo estilo de desenvolvimento</description>
	<lastBuildDate>Wed, 27 Jul 2011 21:19:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Entender Apontadores em C</title>
		<link>http://joaopedropereira.com/blog/2009/11/26/apontadores-c/</link>
		<comments>http://joaopedropereira.com/blog/2009/11/26/apontadores-c/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 00:15:07 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[apontadores]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=554</guid>
		<description><![CDATA[Antes de mais o que é um apontador em português corrente? É algo que aponta para alguma coisa, certo? Ok&#8230; Então vejamos este exemplo: O que é o ponteiro de um relógio? É o que aponta para as horas, minutos ou segundos. Em programação é muito semelhante temos as variáveis e o ponteiro vai apontar [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F11%2F26%2Fapontadores-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F11%2F26%2Fapontadores-c%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Antes de mais o que é um apontador em português corrente? É algo que aponta para alguma coisa, certo? Ok&#8230; Então vejamos este exemplo:</p>
<p>O que é o ponteiro de um relógio? É o que aponta para as horas, minutos ou segundos. Em programação é muito semelhante temos as variáveis e o ponteiro vai apontar para o local da memória onde elas se encontram armazenadas que veremos mais à frente chamar-se de endereço da memória.</p>
<h2>Arquitectura</h2>
<blockquote><p>&#8220;Ponteiros são uma abstracção da capacidade de endereçamento fornecidas pelas arquitecturas modernas. Em termos simples, um endereço de memória é definido para cada unidade de memória no sistema, no qual a unidade é tipicamente um byte ou um char, o que em termos práticos transforma toda a memória num grande vector. Logo, a partir de um endereço, é possível obter o valor armazenado na memória correspondente a esse endereço.&#8221;</p>
<p style="text-align: right;"><span style="text-decoration: underline;">Fonte:</span> <a title="Wikipedia - Ponteiro (programação)" rel="nofollow" href="http://pt.wikipedia.org/wiki/Ponteiro_(programação)" target="_blank">Wikipedia</a></p>
</blockquote>
<p><strong>Resumidamente:</strong> O ponteiro é uma variável como qualquer variável mas que armazena um endereço de uma outra variável.</p>
<h2>Variáveis e Memória</h2>
<p style="text-align: center"><img class="aligncenter" title="Explicação de Memória" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/11/grafico1.png" alt="Explicação de Memória" width="274" height="248" /></p>
<p>Quando declaramos int i=2450; estamos a indicar ao compilador para reservar um espaço na memória para poder armazenar valores do tipo inteiro, com o número de bits associado a este para cada compilador e/ou arquitectura. Simultaneamente é atribuído o valor 2450 à variável i, o que significa que no endereço de memória associado à variável i é armazenado o valor 2450.</p>
<p style="text-align: right;"><img class="aligncenter size-full wp-image-564" title="Apontadores e Memoria" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/11/grafico2.png" alt="Apontadores e Memoria" width="440" height="80" /><span style="text-decoration: underline;"> Nota:</span> este gráfico não está relacionado com o anterior apesar do valor de i ser o mesmo.</p>
<h2>Declarar apontadores</h2>
<p>Antes de começar com a declaração de apontadores quero alertar para um erro muito comum quer em programadores novatos quer em programadores mais experientes, nunca se deve usar um ponteiro sem antes inicializa-lo pois ele estará a tentar aceder a um valor da memória desconhecido e dará erro &#8220;<em>Segmentation Fault</em>&#8220;.</p>
<p>Declarar um apontador é muito simples:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ap  <span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/* declara um ponteiro para um inteiro */</span></pre></div></div>

<p>A instrução anterior indica que ap é um apontador do tipo inteiro. Por outras palavras, ap é uma variável cujo valor é um endereço de uma variável do tipo int.<br />
Existem dois operadores unários que são utilizados com os ponteiros.<br />
Um é o operador (<strong>*</strong>) através dele é possível obter o valor do endereço de memória do ponteiro, o outro é o operador (<strong>&amp;</strong>) que permite obter o endereço de memória.<br />
De forma mais simples:</p>
<ul>
<li><strong>&amp;</strong> significa <strong>“endereço de”</strong>;</li>
<li><strong>* </strong>significa “<strong>conteúdo do endereço para onde aponta”</strong>.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">*</span>ap <span style="color: #339933;">=</span> <span style="color: #0000dd;">33</span><span style="color: #339933;">;</span>  <span style="color: #808080; font-style: italic;">/* atribui o valor 33 à variável que está contida no ponteiro */</span></pre></div></div>

<h2>Exemplos de Operações com Ponteiros</h2>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  <span style="color: #009900;">&#123;</span>
<span style="color: #993333;">int</span> a<span style="color: #339933;">=</span><span style="color: #0000dd;">33</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ap<span style="color: #339933;">=&amp;</span>a<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// &amp;a, devolve o endereço de memória de uma variável</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Valor a: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Endereço a: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Valor apontador: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> ap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Endereço apontador: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>ap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Valor na memória apontada pelo apontador: %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">*</span>ap<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ap1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>ap2<span style="color: #339933;">;</span>
ap1 <span style="color: #339933;">=</span> ap2<span style="color: #339933;">;</span> <span style="color: #808080; font-style: italic;">/* isto fará com que ap1 aponte para o mesmo endereço que ap2 logo usar ap1 é o mesmo que usar ap2 */</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ap1<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>ap2<span style="color: #339933;">;</span>
<span style="color: #339933;">*</span>p1 <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>p2<span style="color: #339933;">;</span><span style="color: #808080; font-style: italic;">/* altera o valor apontado por ap1 para o apontado por ap2 */</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ap<span style="color: #339933;">;</span>
<span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>ap<span style="color: #009900;">&#41;</span><span style="color: #339933;">++;</span> <span style="color: #808080; font-style: italic;">/* incrementa o valor armazenado no endereço para o qual ap aponta*/</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ap<span style="color: #339933;">;</span>
ap<span style="color: #339933;">++;</span> <span style="color: #808080; font-style: italic;">/* se temos um ponteiro para um inteiro e o incrementamos, ele passa a apontar para o próximo inteiro */</span></pre></div></div>

<h2>Resumindo e Concluindo</h2>
<ul>
<li>Uma variável tem sempre um endereço e um valor;</li>
<li>Um apontador é uma variável cujo valor é o endereço de uma outra variável;</li>
<li>Se a for uma variável então &amp;a é o endereço de a;</li>
<li>Se ap for um apontador, *ap é o valor que é indicado por ap;</li>
</ul>
<p style="text-align: center; font-size:13pt;">Qualquer dúvida ou sugestão sintam-se à vontade em comentar, a perguntar é que se pode evoluir, não ficando com as dúvidas só para nós sem serem esclarecidas!</p>
<p>Deixo-vos com um vídeo do Binky a explicar apontadores, penso que será mais interessante e divertido&#8230;</p>
<p style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/6pmWojisM_E&amp;hl=en_US&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/6pmWojisM_E&amp;hl=en_US&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div class="shr-publisher-554"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F11%2F26%2Fapontadores-c%2F' data-shr_title='Entender+Apontadores+em+C'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F11%2F26%2Fapontadores-c%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F11%2F26%2Fapontadores-c%2F' data-shr_title='Entender+Apontadores+em+C'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2009/11/26/apontadores-c/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

