<?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>Blog do Blabos de Blebe &#187; C/C++</title>
	<atom:link href="http://blog.blabos.org/category/c-cpp/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.blabos.org</link>
	<description>Qt, Perl, tecnologia e algum blá blá blá</description>
	<lastBuildDate>Fri, 05 Feb 2010 08:35:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ponteiros e Arrays</title>
		<link>http://blog.blabos.org/2009/05/ponteiros-e-arrays/</link>
		<comments>http://blog.blabos.org/2009/05/ponteiros-e-arrays/#comments</comments>
		<pubDate>Mon, 18 May 2009 09:08:06 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=624</guid>
		<description><![CDATA[No primeiro post desta série, falamos um pouco sobre Ponteiros. No segundo, falamos de Referências. Hoje abordaremos a relação íntima (ui!) entre ponteiros e arrays (ou matrizes).

Relembrando Arrays
Um array, ou matriz, ou ainda um arranjo, é uma abstração matemática utilizada para representar um conjunto de dados homogêneos, ou seja do mesmo tipo (int, float, etc). [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">No primeiro post desta série, falamos um pouco sobre <a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1">Ponteiros</a>. No segundo, falamos de <a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-2">Referências</a>. Hoje abordaremos a relação íntima (ui!) entre ponteiros e arrays (ou matrizes).</p>
<p><span id="more-624"></span></p>
<h2>Relembrando Arrays</h2>
<p style="text-align: justify;">Um array, ou matriz, ou ainda um arranjo, é uma abstração matemática utilizada para representar um conjunto de dados homogêneos, ou seja do mesmo tipo (int, float, etc). Essa abstração é organizada em formato de tabela, com linhas e colunas. Cada elemento na matriz possui coordenadas únicas (linha e coluna), de forma que um dado elemento E(i,j) representa o único elemento na posição &#8220;linha i&#8221;, &#8220;coluna j&#8221;.</p>
<p style="text-align: justify;">A sintaxe de declaração de matrizes segue abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Matrizes unidimensionais ou vetores</span>
<span style="color: #0000ff;">int</span>     ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>               <span style="color: #666666;">// 10 elementos, do 0 ao 9</span>
<span style="color: #0000ff;">char</span>    cvet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">23</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>               <span style="color: #666666;">// 23 elementos, do 0 ao 22</span>
&nbsp;
<span style="color: #666666;">// Matrizes bidimensionais</span>
<span style="color: #0000ff;">int</span>     imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>             <span style="color: #666666;">// 2 linhas (0 a 1) e 3 colunas (0 a 2)</span>
<span style="color: #0000ff;">double</span>  dmat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>            <span style="color: #666666;">// 10 linhas (0 a 9) e 2 colunas (0 a 1)</span></pre></div></div>

<p style="text-align: justify;">Cada elemento da matriz é independente dos demais e pode ser acessado conforme a sintaxe abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Alterando o quarto elemento do vetor ivet.</span>
<span style="color: #666666;">// Lembre-se que começa-se a contar a partir do elemento zero</span>
ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">13</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Lendo o segundo elemento do vetor ivet</span>
<span style="color: #0000ff;">int</span> num <span style="color: #000080;">=</span> ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Alterando o elemento da primeira linha, segunda coluna de imat</span>
imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">42</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Lendo o elemento na terceira linha, quarta coluna de imat</span>
<span style="color: #0000ff;">int</span> foo <span style="color: #000080;">=</span> imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span></pre></div></div>

<p style="text-align: justify;">Neste post não vamos discutir a fundo matrizes, vamos apenas investigar a relação entre matrizes e ponteiros de uma forma bastante intuitiva.</p>
<h2>Tamanhos de matrizes</h2>
<p style="text-align: justify;">Dado que uma matriz é uma abstração que comporta vários valores de um mesmo tipo, qual o tamanho dela? Quanto espaço ele ocupa na memória?</p>
<p style="text-align: justify;">Considere o código abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span>     ivet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span>    cvet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">13</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span>  dvet<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">20</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">char</span>    cmat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>     imat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">5</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">4</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(int)     = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(char)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(double)  = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(ivet)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>ivet<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(cvet)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cvet<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(dvet)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>dvet<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(cmat)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cmat<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;sizeof(imat)    = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>imat<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">O resultado é bastante razoável. O Espaço ocupado por uma matriz é igual ao número de elementos multiplicado pelo tamanho do tipo do elemento (linhas x colunas x sizeof(tipo)). Ora, se cada elemento é independente, supõe-se que cada um ocupe um lugar separado na memória, caso contrário um elemento sobrescreveria outro. Sendo assim, será que cada elemento possui seu próprio endereço de memória?</p>
<h2>Matrizes e endereços de memória</h2>
<p style="text-align: justify;">Para facilitar, vamos então analisar os possíveis endereços de uma matriz de caracteres, cujo tamanho de um dado único é 1 byte:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'A'</span>, <span style="color: #FF0000;">'B'</span>, <span style="color: #FF0000;">'C'</span>, <span style="color: #FF0000;">'D'</span>, <span style="color: #FF0000;">'E'</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Mostrando o índices, valores e endereços dos dados.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Índice<span style="color: #000099; font-weight: bold;">\t</span>Valor<span style="color: #000099; font-weight: bold;">\t</span>Endereço do elemento<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\t</span>%c<span style="color: #000099; font-weight: bold;">\t</span>%p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, i, cvet<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>, <span style="color: #000040;">&amp;</span>cvet<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #666666;">// Mostrando o endereço da própria matriz</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Endereço da matriz: %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Mostrando o endereço da própria matriz denovo</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Endereço da matriz: %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Os endereços dos elementos são sequenciais, ou seja, cada elemento é armazenado ao lado do anterior. Adicionalmente existem dois fatos ainda mais interessantes:</p>
<p style="text-align: justify;">
<ol>
<li>O endereço do array (&#038;cvet), mostrado na linha 25, é o mesmo do primeiro elemento do array;</li>
<li>A própria variável cvet pode ser interpretada como um ponteiro, como é mostrado na linha 28;</li>
</ol>
<p style="text-align: justify;">Em C++, um array comum é um bloco contíguo de memória cujo nome pode ser interpretado (cast) como um ponteiro que aponta para o seu primeiro elemento. Adicionalmente é válido fazer um ponteiro apontar para um array desde que o ponteiro destino seja para o mesmo tipo que o tipo dos elementos do array. Durante a atrubuição de um array a um ponteiro, o compilador faz uma conversão implícita de tipos. O ponteiro destino passa a ser interpretado como um ponteiro para a área de memória ocupada pelo array.</p>
<p style="text-align: justify;">Uma das consequências não tão óbvias é que durante o cast implícito, é perdida a informação de que aquela área de memória era um array. Portanto é perdida a informação do tamanho do array. Do ponto de vista do ponteiro, ele está apontando para o começo de um bloco arbitrário de memória, de um tamanho também arbitrário. Sair de um array e ir para um ponteiro significa ir de uma abstração mais restritiva e mais alto nível, para um abstração menos restritiva e mais baixo nível.</p>
<p style="text-align: justify;">Por outro lado tentar atribuir um ponteiro a um array gera um erro de compilação por tipos incompatíveis. Um array é um bloco de memória de n dados (bytes), já um ponteiro possui apenas um dado, um endereço. O compilador não tem como saber de antemão se um ponteiro aponta para uma área de 1, 2 ou 200 bytes.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">300</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> pc <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Antes da atribuição<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;cvet = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pc   = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pc<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(cvet) = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cvet<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(pc)   = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
pc <span style="color: #000080;">=</span> cvet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Depois da atribuição<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;cvet = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, cvet<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pc   = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pc<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(cvet) = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>cvet<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;sizeof(pc)   = %lu<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pc<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Note que antes da atribuição (linha 25) o ponteiro <strong>pc</strong>. está nulo, pois foi inicializado assim. Já os tamanhos indicam que o array possui 300 bytes e o ponteiro apenas 8 (minha máquina é um amd 64). Após a atribuição ambos passam a &#8220;apontar&#8221; para a mesma área de memória, porém os tamanhos não mudam. Houve um cast implicito de char[300] para char*, e nessa brincadeira o ponteiro <strong>pc</strong> não tem como saber o tamanho da área de memória para o qual ele aponta. Já o array <strong>cvet</strong> continua sabendo direitinho o que ele é, sem nenhuma crise existencial.</p>
<h2>Aritmética de ponteiros &#8211; Vulgo, e daí?</h2>
<p style="text-align: justify;">Ora, mas se eu sei que os dados numa matriz estão dispostos lado a lado, eu posso utilizar um ponteiro que vai pulando para o endereço ao lado e acessando o elemento seguinte. O nome disso é aritimética de ponteiros.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">6</span><span style="color: #008080;">;</span> 
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'L'</span>,<span style="color: #FF0000;">'A'</span>,<span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'O'</span>,<span style="color: #FF0000;">'S'</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> pc <span style="color: #000080;">=</span> cvet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>pc <span style="color: #000040;">+</span> i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span>pc<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
&nbsp;
<span style="color: #666666;">// Agora com inteiros</span>
<span style="color: #0000ff;">int</span> ivet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #0000dd;">1</span>, <span style="color: #0000dd;">2</span>, <span style="color: #0000dd;">3</span>, <span style="color: #0000dd;">4</span>, <span style="color: #0000dd;">5</span>, <span style="color: #0000dd;">6</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> pi <span style="color: #000080;">=</span> ivet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%p = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pi, <span style="color: #000040;">*</span>pi<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Em duas dimensões</span>
<span style="color: #0000ff;">char</span> cmat<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'L'</span>,<span style="color: #FF0000;">'A'</span><span style="color: #008000;">&#125;</span>,<span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'O'</span>,<span style="color: #FF0000;">'S'</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">char</span><span style="color: #000040;">*</span> ppc<span style="color: #008080;">;</span>
&nbsp;
ppc <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>cmat<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> j <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span> j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>ppc <span style="color: #000040;">+</span> <span style="color: #0000dd;">3</span><span style="color: #000040;">*</span>i<span style="color: #000040;">+</span>j<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Na linha 18 o ponteiro <strong>pc</strong> passa a pontar para o array <strong>cvet</strong>, e consequentemente para o seu primeiro elemento, o caracter &#8216;B&#8217;. Na linha 21 o conteúdo de pc, que é o endereço onde foi armazenado o caracter &#8216;B&#8217;, é incrementado de i e em seguida de-referenciado. Na primeira passada o valor de i é zero, portanto é dereferenciado para o valor &#8216;B&#8217;. Nos passos seguintes, o endereço seguinte vai sendo de-referenciado para os outros caracteres armazenados no array original. É mais ou menos isso que internamente o compilador faz quando você utiliza a sintaxe cvet[i]. A abstração de array te dá uma forma mais amigável de tratar áreas contíguas de memória do que <strong>*(pc + i)</strong>.</p>
<p style="text-align: justify;">Mas se a abstração de array é mais simples, pra que utilizar aritmética de ponteiros?</p>
<p style="text-align: justify;">Uma das respostas está a linha 26. Ela faz a mesma coisa que a linha 21, porém um pouco mais rápido. Na sintaxe da linha 21, ou de forma semelhante, na sintaxe de array, o acesso a um dado qualquer pode ser resumido de forma bem grosseira nos comandos:</p>
<p style="text-align: justify;">
<ol>
<li>Tome o endereço base do array;</li>
<li>Adicione ao endereço o valor do índice;</li>
<li>De-referencie este novo endereço;</li>
</ol>
<p style="text-align: justify;">Já com aritmética de ponteiro ficaria assim:</p>
<p style="text-align: justify;">
<ol>
<li>De-referencie este endereço;</li>
</ol>
<p style="text-align: justify;">O comando incremento (ou a conta feita com endereços) não vou contar porque é parte do loop, embora <strong>i++;</strong> seja mais rápido que <strong>a = b + c;</strong>. Agora imagine esse pequeno ganho de 66% aplicado em uma área de dados de 1 MB. Serão mais de 2 milhões de comandos a menos!</p>
<p style="text-align: justify;">A técnica de utilizar um ponteiro para manipular uma área arbitrária de memória é utilizada geralmente em programação de baixo nível (mais próximo da máquina), manipulação de <a href="http://en.wikipedia.org/wiki/Data_buffer">buffers</a> e strings, entre outros truques sujos. Nas entranhas dos computadores, operações que varrem extensas áreas de memória, frequentemente são realizadas com aritimética de ponteiros. Nesse nível, <a href="http://en.wikipedia.org/wiki/Natural_selection">Darwin</a> reina supremo e só os mais preparados sobrevivem. A partir daqui a linguagem começa a dar um poder que só os puros de coração conseguem compreender.</p>
<p style="text-align: justify;">Uma observação importante é que entre as linhas 31 e 38 a experiência é repetida com inteiros. Note que como os inteiros possuem 4 bytes, os incrementos são automaticamente feitos de 4 em 4 bytes, e não de 1 em 1, ou seja o incremento é automaticamente calculado para sizeof(tipo). Incrementar um ponteiro significa acessar a próxima área de memória semelhante ao dado atual, e não apenas o próximo endereço. Como o tamanho de um char é um byte, quando incremetamos um ponteiro para char, avançamos apenas 1 byte. Se incrementarmos um ponteiro para double, avançaremos 8 bytes, e assim por diante.</p>
<p style="text-align: justify;">Outra observação é que uma matriz bidimensional pode ser &#8220;linearizada&#8221; conforme é mostrado nas linhas 40 a 52. Isso é útil, quando aplicável, para aproveitar melhor o cache do processador, por exemplo.</p>
<h2>void*, o <a href="http://en.wikipedia.org/wiki/Pansexuality">Pansexual</a> dos ponteiros</h2>
<p style="text-align: justify;">Anteriormente eu disse que só era possível atribuir um array a um ponteiro que fosse para o mesmo tipo que os dados do array. Eu menti descaramente! O motivo, é que para alguém que desistiu do post antes deste tópico, é mais seguro acreditar que não pode <img src='http://blog.blabos.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  !</p>
<p style="text-align: justify;">Existem duas exceções à regra. A primeira é quando há uma conversão explícita de tipos e o ponteiro destino &#8220;acha&#8221; que está apontando para o tipo certo. Um exemplo está na linha 44 do código anterior.</p>
<p style="text-align: justify;">A segunda é o caso dos ponteiros para void. Um ponteiro para void é um ponteiro que não faz exigências quanto ao tipo de dados que está na área de memória para o qual ele aponta. Ele é um ponteiro pra uma área genérica de memória, algo bem baixo nível.</p>
<p style="text-align: justify;">Para utilizar um dado apontado por um ponteiro para void, antes de de-referenciá-lo, é preciso fazer um cast explícito para algum tipo válido, pois se um int* é de-referenciado para int e um char* é de-referenciado para char, adivinhe para que é de-referenciado um void*?</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> max <span style="color: #000080;">=</span> <span style="color: #0000dd;">6</span><span style="color: #008080;">;</span> 
<span style="color: #0000ff;">char</span> cvet<span style="color: #008000;">&#91;</span>max<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span><span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'L'</span>,<span style="color: #FF0000;">'A'</span>,<span style="color: #FF0000;">'B'</span>,<span style="color: #FF0000;">'O'</span>,<span style="color: #FF0000;">'S'</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span><span style="color: #000040;">*</span> pv <span style="color: #000080;">=</span> cvet<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Erro de compilação.</span>
<span style="color: #666666;">//*pv</span>
<span style="color: #666666;">// Quanto vale sizeof(void)?</span>
&nbsp;
<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span> i <span style="color: #000080;">&lt;</span> max<span style="color: #008080;">;</span> i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%c&quot;</span>, <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span><span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>pv<span style="color: #008000;">&#41;</span> <span style="color: #000040;">+</span> i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Ponteiro para void são utilizados quando precisa-se apontar para uma área genérica de memória sem ter controle/conhecimento do tipo de dados que essa área contém, ou em funções que não podem fazer suposições sobre os tipos de seus parâmetros, como é o caso da API da lib <a href="https://computing.llnl.gov/tutorials/pthreads/">pthreads</a> (link arbitrário).</p>
<h2>Encerrando</h2>
<p style="text-align: justify;">Quanto mais nos aprofundamos nos tópicos sobre ponteiros, mais próximos da máquina ficamos. Boa parte do poder das linguagens C e C++ provém daí, e boa parte dos problemas também. A complexidade vai aumentando e os riscos também. Para muitos é aí que mora a diversão!</p>
<h2>Links</h2>
<p style="text-align: justify;">
<ul>
<li><a href="http://src.blabos.org/blog/posts/2009/05/18/arrays.zip">arrays.zip</a> (todos os fontes do post);</li>
<li><a href="http://www.cplusplus.com/doc/tutorial/pointers/">Ponteiros no cplusplus.com</a></li>
<li><a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/">Ponteiros no blabos.org</a></li>
<li><a href="http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/">Referências no blabos.org</a></li>
<li><a href="http://www.research.att.com/~bs/">O Culpado</a></li>
</ul>
<p class="buymebeer"><form action="https://www.paypal.com/cgi-bin/webscr" target="paypal" method="post"><input type="hidden" name="cmd" value="_xclick" /><input type="hidden" name="business" value="blabos@blabos.org" /><input type="hidden" name="return" value="" /><input type="hidden" name="item_name" value="Buy Me a Beer for Ponteiros e Arrays" /><input type="hidden" name="currency_code" value="" /><input type="hidden" name="amount" value="" /><input type="image" src="http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif" align="left" alt="" title="" hspace="3" /></form><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+Ponteiros+e+Arrays" target="paypal">If you liked this post, buy me a beer</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/05/ponteiros-e-arrays/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ponteiros e referências em C++ parte 2</title>
		<link>http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/</link>
		<comments>http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/#comments</comments>
		<pubDate>Sat, 02 May 2009 06:32:51 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=578</guid>
		<description><![CDATA[Continuando com essa tentativa de série de posts sobre ponteiros e referências, que começou falando sobre Ponteiros, hoje abordaremos Referências.

Uma referência é um nome alternativo para um objeto, um alias. Aliás, quem diz isso não sou eu, mas o próprio Bjarne Stroustrup, lá pelo tópico 5.5 do seu livro, cujo conteúdo é tão bom que [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Continuando com essa tentativa de série de posts sobre ponteiros e referências, que começou falando sobre <a href="http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/">Ponteiros</a>, hoje abordaremos Referências.</p>
<p><span id="more-578"></span></p>
<p style="text-align: justify;">Uma referência é um nome alternativo para um objeto, um alias. Aliás, quem diz isso não sou eu, mas o próprio <a href="http://www.research.att.com/~bs/">Bjarne Stroustrup</a>, lá pelo tópico 5.5 do seu <a href="http://www.research.att.com/~bs/3rd.html">livro</a>, cujo conteúdo é tão bom que só fui reparar hoje que na capa tem uma onda quebrando em forma de C. Gostei dessa capa!</p>
<h2>Declarando Referências</h2>
<p style="text-align: justify;">Uma referência para um determinado tipo é declarada acrescentando-se o <strong>caracter</strong> &amp; (ê comercial ou <a href="http://en.wikipedia.org/wiki/&#038;">ampersand</a>) após o nome do tipo da referência. Note que da mesma forma que na declaração de ponteiros, estamos tratando o <strong>&amp;</strong> como um caracter de notação e não um operador. Não há um <strong>operador</strong> de declaração de ponteiros ou referências. É apenas uma notação da linguagem. Dado um tipo T, a expressão <strong>T&amp;</strong> significa <strong>Referência para T</strong>. Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Declara uma variável inteira original.</span>
<span style="color: #666666;">// Também poderia ser char, float, etc.</span>
<span style="color: #0000ff;">int</span> i<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Declaram referências para a variável i.</span>
<span style="color: #666666;">// Todas as formas são equivalentes, mas preferimos a primeira.</span>
<span style="color: #666666;">// Note que os tipos das referências tem que ser os mesmos</span>
<span style="color: #666666;">// que os das variáveis referenciadas.</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> ra     <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>rb     <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span> rc    <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Diferentemente de ponteiros, a linha abaixo gera um</span>
<span style="color: #666666;">// erro de compilação. Você saberia dizer por quê?</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">&amp;</span>r1, <span style="color: #000040;">&amp;</span>r2<span style="color: #008080;">;</span></pre></div></div>

<p style="text-align: justify;">Embora em C++ as referências lembrem um pouco os ponteiros, eles são bem diferentes. Ao contrário do que acontece com ponteiros, uma referência precisa ser inicializada durante sua declaração. Tentar declarar uma referência sem inicializá-la gera um erro em tempo de compilação, ou seja, o compilador vai cuspir na sua cara &#8220;Perdeu playboy, perdeu!&#8221;. A única exceção a essa regra é para referências declaradas como <a href="http://en.wikipedia.org/wiki/External_variable">extern</a>, pois elas serão inicializadas em algum outro ponto do programa, mas isso é outro papo.</p>
<p style="text-align: justify;">Se você tentar trapacear declarando uma referência extern sem inicializá-la o compilador não vai reclamar. Se ela nunca for utilizada, ok. Se o compilador for esperto e notar que ela não será utilizada, pode até removê-la da lista de símbolos. Mas se ela for utilizada em qualquer parte do programa, o linker vai rir da sua cara gargalhando &#8220;undefined reference to &#8216;nome_da_variavel&#8217;&#8221;. Portanto faça as coisas direitinho. Declarou uma referência? Então iniclalize-a. extern? Tem certeza que sabe o que está fazendo?</p>
<p style="text-align: justify;">A lógica por trás disso é que uma referência foi planejada para ser um nome para alguma coisa. Se você não a inicializar, ela não será nome para nada, então não faz sentido. Um detalhe muito importante é que inicializar uma referência <strong>não</strong> é atribuir um valor a ela. Como o prório Bjarne diz, nenhum operador opera sobre referências, ou seja, não há como atribuir, somar, subtrair, etc com uma referência. Como uma referência é um apelido para um objeto, cada operador atua nese objeto, e não na referência. Uma vez inicializada, uma referência sempre referenciará o mesmo objeto.</p>
<p style="text-align: justify;">A primeira armadilha com referências, assim como ponteiros está na questão do tamanho. Enquanto o tamanho de um ponteiro (e de outras estruturas de dados) pode ser obtido com o operador sizeof, o tamanho de uma referência não pode ser obtido por técnicas convencionais, já que ao aplicar o operador sizeof em uma referência, estamos na verdade, aplicando o operador no objeto ao qual ela se referencia, conforme vimos no parágrafo anterior.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">char</span>    c<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>     i<span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span>  d<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">char</span><span style="color: #000040;">&amp;</span>   rc <span style="color: #000080;">=</span> c<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span>    ri <span style="color: #000080;">=</span> i<span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span><span style="color: #000040;">&amp;</span> rd <span style="color: #000080;">=</span> d<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// O operador sizeof diz o tamanho do tipo do seu argumento.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of char:    &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of int:     &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of double:  &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>d<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of char&amp;:   &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>rc<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of int&amp;:    &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>ri<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of double&amp;: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>rd<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">As técnicas para obter os tamanhos das referências fogem ao escopo deste texto, mas pretendo falar sobre elas futuramente. Por hora, vou apenas dizer sem demonstrar que, quando aplicável, o tamanho de uma referência é idêntico ao tamanho de um ponteiro.</p>
<p style="text-align: justify;">A parte boa da história é que frequentemente os tamanhos de ponteiros e referências são bem menos relevantes que os tamanhos dos objetos apontados ou referenciados. Eu particularmente, nunca precisei utilizar essa informação, mas para o desenvolvimento em arquiteturas diferentes ou para sistemas embarcados, isso já se torna mais interessante.</p>
<h2>Utilizando Referências</h2>
<p style="text-align: justify;">O uso de referências já é bem mais simples que o de ponteiros, pois não são necessários operadores de extração de endereços ou de de-referenciação. Variáveis referências são utilizadas como variáveis comuns, lembrando que uma operação feita numa referência sempre afeta o objeto referenciado.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> x, y<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> rx <span style="color: #000080;">=</span> x<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> ry <span style="color: #000080;">=</span> y<span style="color: #008080;">;</span>
&nbsp;
x <span style="color: #000080;">=</span> <span style="color: #0000dd;">13</span><span style="color: #008080;">;</span>
y <span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
&nbsp;
rx <span style="color: #000080;">=</span> <span style="color: #0000dd;">42</span><span style="color: #008080;">;</span>    <span style="color: #666666;">// A atribuição é automaticamente aplicada em x.</span>
ry<span style="color: #000040;">++</span><span style="color: #008080;">;</span>       <span style="color: #666666;">// O incremento é automaticamente aplicado em y.</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;x:  &quot;</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>    <span style="color: #666666;">// Valor de x.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;y:  &quot;</span> <span style="color: #000080;">&lt;&lt;</span> y <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>    <span style="color: #666666;">// Valor de y.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;rx: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> rx <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>   <span style="color: #666666;">// Valor de rx == x.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;ry: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> ry <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>   <span style="color: #666666;">// Valor de ry == y.</span></pre></td></tr></table></div>

<p style="text-align: justify;">Utilizar uma referência é tão transparente para o programador, que ele nem precisa saber que é uma referência. Simplesmente usa como se fosse uma variável ordinária. Com minha imaginação limitada não vejo como alguém consiga ser <a href="http://en.wikipedia.org/wiki/Excommunication">excomungado</a> por utilizar referências inadequadamente. Embora sempre tenha algum <a href="http://pt.wiktionary.org/wiki/esp%C3%ADrito_de_porco">espírito de porco</a> que consiga fazer merda com referências, é muito mais fácil levar rasteira de <a href="http://pt.wikipedia.org/wiki/Saci">Saci</a> ao manusear ponteiros.</p>
<h2>Endereços e Referências</h2>
<p style="text-align: justify;">Do ponto de vista de <a href="http://en.wikipedia.org/wiki/Murphy%27s_law">Murphy</a>, as referências são feias, chatas e bobas, pois existe pouca coisa potencialmente perigosa a se fazer com elas. Nem mesmo quanto a endereçamento há muitas surpresas (será?). Considere o código abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> a <span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> b <span style="color: #000080;">=</span> <span style="color: #0000dd;">13</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> ra <span style="color: #000080;">=</span> a<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">&amp;</span> rb <span style="color: #000080;">=</span> b<span style="color: #008080;">;</span>
&nbsp;
ra <span style="color: #000080;">=</span> <span style="color: #0000dd;">42</span><span style="color: #008080;">;</span>
rb <span style="color: #000080;">=</span> <span style="color: #0000dd;">7</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;ra  = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> ra <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><span style="color: #666666;">// O valor de ra == 42.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;rb  = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> rb <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><span style="color: #666666;">// O valor de rb == 7.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;a   = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> a <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span> <span style="color: #666666;">// O valor de a == ra == 42.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;b   = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> b <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span> <span style="color: #666666;">// O valor de b == rb == 7.</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&amp;a  = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">&amp;</span>a <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span> <span style="color: #666666;">// O endereço de a.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&amp;b  = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">&amp;</span>b <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span> <span style="color: #666666;">// O endereço de b.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&amp;ra = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">&amp;</span>ra <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><span style="color: #666666;">// O endereço de ra == &amp;a. </span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;&amp;rb = &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">&amp;</span>rb <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span><span style="color: #666666;">// O endereço de rb == &amp;b.</span></pre></td></tr></table></div>

<p style="text-align: justify;">Nas linhas 17 e 18 eu declaro duas variáveis inteiras (poderia ter feito esse exemplo com uma só&#8230;). Nas linhas 20 e 21 eu declaro duas referências, referenciando as duas variáveis anteriores. A partir desse momento as variáveis ra e rb são apenas <strong>apelidos</strong> para as variáveis a e b. Como vimos anteriormente, qualquer operador aplicado às referências, na verdade atua nos objetos referenciados, portanto cada par variável-referência possui sempre o mesmo valor.</p>
<p style="text-align: justify;">A parte interessante a se notar é que os endereços das referências são exatamente os mesmo endereços das variáveis que elas referenciam, ao contrário dos ponteiros que tinham seus próprios endereços. Por quê? Porque você caiu na <a href="http://desciclo.pedia.ws/wiki/S%C3%A9rgio_Malandro">Pegadinha do Malandro</a>. Lembra daquele papo de nenhum operador ser aplicável a uma referência? Pois bem, o <strong>&amp;</strong> utilizado aqui é o <strong>operador</strong> &#8220;endereço de&#8221;, que também é aplicado diretamente nas variáveis originais e não nas referências. As mesmas técnicas ninja utilizadas para obter os tamanhos das referências são necessárias para se obter os endereços delas.</p>
<p style="text-align: justify;">Novamente a parte divertida disso é que o mecanismo de referências foi planejado para ser o mais transparente possível para o programador. Tamanhos e endereços físicos de referências são informações irrelevantes do ponto de vista da programação &#8220;normal&#8221; em C++.</p>
<h2>Diferenças e semelhanças entre Ponteiros e Referências</h2>
<p style="text-align: justify;">Tanto ponteiros como referências são mecanismos de indireção em C++, ou seja, são mecanismos utilizados para que a partir de um dado símbolo (variável) eu seja capaz de manipular outro objeto.</p>
<p style="text-align: justify;">Os principais usos para ponteiros são geralmente relacionados com gerenciamento e manipulação dinâmica de memória, criação e destruição de objetos de formas e em momentos especiais, bem como &#8220;passagem de parâmetros por referência&#8221; (assim entre aspas mesmo). Já as referências são mais utilizadas em passagem por referência (por que será?) e sobrecarga de operadores.</p>
<p style="text-align: justify;">Basicamente, tudo que podemos fazer com referências pode ser emulado com ponteiros. Já a recíprocra não é sempre verdadeira. A grande vantagem delas no entanto, é o fato de tornarem a indireção completamente transparente ao programador.</p>
<p style="text-align: justify;">Uma alegoria interesante para ajudar a entender melhor as diferenças entre ponteiros e referências é o apelido. Por exemplo: Imagine que um pessoa, digamos, <a href="http://pt.wikipedia.org/wiki/Carlos_Caetano_Bledorn_Verri">Carlos Caetano Bledorn Verri</a>, seja a nossa variável original, o objeto. <a href="http://pt.wikipedia.org/wiki/Carlos_Caetano_Bledorn_Verri">Dunga</a> já é uma referência a Carlos Caetano Bledorn Verri, pois é um apelido para o mesmo objeto, são a mesma pessoa. Já a Mãe do Dunga (ou do Carlos Caetano Bledorn Verri, tanto faz), que é contantemente citada pela torcida, pode ser considerada um ponteiro para ele, pois dados determinados operadores de vocabulário, um elogio feito a ela, na verdade é <strong>indiretamente direcionado</strong> a ele.</p>
<h2>Links</h2>
<p style="text-align: justify;">
<ul>
<li><a href="http://src.blabos.org/blog/posts/2009/05/02/referencias.zip">referencias.zip</a> (todos os fontes do post);</li>
<li><a href="http://src.blabos.org/blog/posts/2009/05/02/01-declaracao.cpp">01-declaracao.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/05/02/02-tamanhos.cpp">02-tamanhos.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/05/02/03-utilizando.cpp">03-utilizando.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/05/02/04-enderecos.cpp">04-enderecos.cpp</a></li>
<li><a href="http://www.research.att.com/~bs/">O Culpado</a></li>
</ul>
<p class="buymebeer"><form action="https://www.paypal.com/cgi-bin/webscr" target="paypal" method="post"><input type="hidden" name="cmd" value="_xclick" /><input type="hidden" name="business" value="blabos@blabos.org" /><input type="hidden" name="return" value="" /><input type="hidden" name="item_name" value="Buy Me a Beer for Ponteiros e referências em C++ parte 2" /><input type="hidden" name="currency_code" value="" /><input type="hidden" name="amount" value="" /><input type="image" src="http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif" align="left" alt="" title="" hspace="3" /></form><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+Ponteiros+e+referências+em+C+++parte+2" target="paypal">If you liked this post, buy me a beer</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/05/ponteiros-e-referencias-em-c-parte-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ponteiros e referências em C++ parte 1</title>
		<link>http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/</link>
		<comments>http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 22:44:20 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=454</guid>
		<description><![CDATA[Ponteiros e referências são dois conceitos importantíssimos em ciência da computação. Eles aparecem em muitas linguagens de programação com uma roupagem ou pouco diferente, mas basicamente o tratamento é o mesmo. Em C++, habilidades com ponteiros são fundamentais.

Ponteiro é um tipo especial de dado, cujas variáveis declaradas desse tipo podem apontar (ou não) para algum [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Ponteiros e referências são dois conceitos importantíssimos em ciência da computação. Eles aparecem em muitas linguagens de programação com uma roupagem ou pouco diferente, mas basicamente o tratamento é o mesmo. Em C++, habilidades com ponteiros são fundamentais.</p>
<p><span id="more-454"></span></p>
<p style="text-align: justify;">Ponteiro é um tipo especial de dado, cujas variáveis declaradas desse tipo podem apontar (ou não) para algum outro dado na memória. Uma variável do tipo ponteiro, guarda o endereço de um outra coisa na memória. Essa coisa pode ser alguma variável, constante, início de um conjunto de dados, uma função, entre outras.</p>
<h2>Declarando Ponteiros</h2>
<p style="text-align: justify;">A declaração de um ponteiro é normalmente feita acrescentando-se um * antes do nome da variável. Uma notação muito utilizada cola o * ao nome do tipo para dizer simbolicamente que se está declarando um &#8220;ponteiro para o tipo&#8221;, ao invés de uma &#8220;variável ponteiro&#8221;, mas elas são equivalentes. Por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #666666;">// Ponteiro para um int.</span>
<span style="color: #0000ff;">int</span><span style="color: #000040;">*</span> ptr_num1<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Ou assim.</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>ptr_num2<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Ponteiro para um double.</span>
<span style="color: #0000ff;">double</span><span style="color: #000040;">*</span> ptr_double1<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// Ou assim.</span>
<span style="color: #0000ff;">double</span> <span style="color: #000040;">*</span>ptr_double2<span style="color: #008080;">;</span></pre></div></div>

<p style="text-align: justify;">Depois de declarado, o ponteiro existe, possui tamanho e consequentemente ocupa lugar na memória. O tamanho de um ponteiro geralmente é igual ao número de bits da máquina/sistema em questão, por exemplo 4 bytes num sistema 32 bits.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">char</span>    c, <span style="color: #000040;">*</span>pc<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span>     i, <span style="color: #000040;">*</span>pi<span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span>  d, <span style="color: #000040;">*</span>pd<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #666666;">// O operador sizeof diz o tamanho do tipo do seu argumento.</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of char:    &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>c<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of int:     &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of double:  &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>d<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of char*:   &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pc<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of int*:    &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pi<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Size of double*: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>pd<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot; bytes&quot;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<h2>Utilizando Ponteiros</h2>
<p style="text-align: justify;">Após a sua declaração, o conteúdo de um ponteiro é um valor aleatório, lixo de memória, como qualquer variável. Para que ele seja útil precisamos atribuir algo a ele. Como um ponteiro guarda um endereço de memória, precisamos atribuir a ele um endereço válido.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> x, y<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>px, <span style="color: #000040;">*</span>py<span style="color: #008080;">;</span>
&nbsp;
x <span style="color: #000080;">=</span> <span style="color: #0000dd;">13</span><span style="color: #008080;">;</span>
y <span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
&nbsp;
px <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>x<span style="color: #008080;">;</span>
py <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>y<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #000040;">*</span>px <span style="color: #000080;">=</span> <span style="color: #0000dd;">42</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>py<span style="color: #008000;">&#41;</span><span style="color: #000040;">++</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">*</span>px <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">*</span>py <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>px<span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>py<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">O operador <strong>&amp;</strong> (ê comercial ou  <a href="http://en.wikipedia.org/wiki/&#038;">ampersand</a>) antes do nome de uma variável significa &#8220;o endereço de&#8221;, até porque o seu nome é &#8220;endereço de&#8221;.</p>
<p style="text-align: justify;">O que está à esquerda da igualdade tem que poder guardar exatamente o mesmo tipo do que estiver do outro lado da igualdade. Um ponteiro guarda um endereço. Portanto para atribuir um endereço a um ponteiro, neste caso, é preciso obter um endereço com o operador &amp;.</p>
<p style="text-align: justify;">Exceto nos caso em que há conversão implícita de tipos (como entre tipos numéricos), atribuir a uma variável algo com um tipo diferente do seu, causa um erro de compilação. Felizmente!!!</p>
<p style="text-align: justify;">Depois que um ponteiro já apontar para um endereço válido, poderemos acessar o conteúdo desse endereço com o operador <strong>*</strong> (<a href="http://en.wikipedia.org/wiki/*">Asterisco</a>), cujo nome formal é &#8220;operador de de-referência&#8221;.</p>
<p style="text-align: justify;">Note que o asterisco em uma <strong>declaração</strong> significa &#8220;ponteiro para o tipo&#8221; e no contexto da <strong>leitura ou escrita</strong> do conteúdo de um ponteiro, significa &#8220;o conteúdo do endereço&#8221; ou &#8220;o conteúdo apontado por&#8221;. Também cuidado para não confundir com o símbolo para produto aritmético. Para não confundir, lembre-se daquela <a href="http://www.cppreference.com/wiki/operator_precedence">tabela enorme de precedência dos operadores</a>, que você só passou o olho e deixou cair no esquecimento. Nela você vai encontrar que o operador de de-referência tem precedência sobre o operador de multiplicação. Feito isso você vai se lembrar que o operador de de-referência é avaliado <strong>ANTES</strong> do operador de multiplicação.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> a, b, c, <span style="color: #000040;">*</span>pa, <span style="color: #000040;">*</span>pb<span style="color: #008080;">;</span>
a <span style="color: #000080;">=</span> <span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
b <span style="color: #000080;">=</span> <span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>
&nbsp;
pa <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>a<span style="color: #008080;">;</span>
pb <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>b<span style="color: #008080;">;</span>
&nbsp;
c <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>pa <span style="color: #000040;">*</span> <span style="color: #000040;">*</span>pb<span style="color: #008080;">;</span>
c <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>pa <span style="color: #000040;">*</span> <span style="color: #000040;">*</span> pb<span style="color: #008080;">;</span>
c <span style="color: #000080;">=</span> <span style="color: #000040;">*</span> pa <span style="color: #000040;">*</span> <span style="color: #000040;">*</span> pb<span style="color: #008080;">;</span>
c <span style="color: #000080;">=</span> <span style="color: #000040;">*</span>pa<span style="color: #000040;">**</span>pb<span style="color: #008080;">;</span>
c <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>pa<span style="color: #008000;">&#41;</span> <span style="color: #000040;">*</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;Valor da Pegadinha: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> c <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Assim quando aquela prova de algoritmos te perguntar o que faz qualquer uma das últimas 5 linhas do exemplo, você vai dizer que ela multiplica os conteúdos apontados por pa e pb. Não vai mais precisar pegar DP por causa disso! E de quebra na vida real, se você realmente precisar fazer isso, você vai salvar suas 4 gerações passadas e as 5 futuras da <a href="http://en.wikipedia.org/wiki/Excommunication">excomunhão</a>, se escolher usar a última linha.</p>
<p style="text-align: justify;">Tudo que é possível fazer com uma variável comum é possível fazer com o conteúdo apontado por um ponteiro, seja leitura ou escrita (a menos é claro que o ponteiro seja const, mas isso é outro papo&#8230;).</p>
<h2>Endereços e Ponteiros</h2>
<p style="text-align: justify;">Tomemos como exemplo o código abaixo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> a, b<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> <span style="color: #000040;">*</span>pa, <span style="color: #000040;">*</span>pb<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Antes de qualquer atribuição:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;a  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;b  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pa = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pb = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Endereço válido dado pelo SO.</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;a   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;b   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pa  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pb  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
&nbsp;
<span style="color: #666666;">// Tente descomentar as linhas abaixo, recompilar e rodar.</span>
<span style="color: #666666;">//printf(&quot;*pa  = %d\n&quot;, *pa); // O que será (*aleatório)?</span>
<span style="color: #666666;">//printf(&quot;*pb  = %d\n&quot;, *pb); // O que será (*aleatório)?</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Após as inicializações dos ponteiros:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
pa <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>a<span style="color: #008080;">;</span>
pb <span style="color: #000080;">=</span> <span style="color: #000040;">&amp;</span>b<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;a  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;b  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pa = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pb = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;a   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;b   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo não inicializado (aleatório).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pa  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;a).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pb  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;b).</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pa = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pa (*pa == a).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pb = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pb (*pb == b).</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Após as inicializações dos inteiros:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
a <span style="color: #000080;">=</span> <span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>
b <span style="color: #000080;">=</span> <span style="color: #0000dd;">13</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;a  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;b  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pa = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pb = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;a   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo inicializado (10).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;b   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo inicializado (13).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pa  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;a).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pb  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;b).</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pa = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pa (*pa == a == 10).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pb = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pb (*pb == b == 13).</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Alterando os valores através dos ponteiros:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #000040;">*</span>pa <span style="color: #000080;">=</span> <span style="color: #0000dd;">7</span><span style="color: #008080;">;</span>
<span style="color: #000040;">*</span>pb <span style="color: #000080;">=</span> <span style="color: #0000dd;">42</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;a  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;b  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pa = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;&amp;pb = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">&amp;</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Mesmo endereço válido dado pelo SO.</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;a   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, a<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo inicializado (a == *pa ==  7).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;b   = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, b<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>  <span style="color: #666666;">// Conteúdo inicializado (b == *pb == 42).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pa  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;a).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pb  = %p<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">// Conteúdo inicializado (&amp;b).</span>
&nbsp;
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pa = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pa<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pa ( 7).</span>
<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;*pb = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>, <span style="color: #000040;">*</span>pb<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #666666;">// Conteúdo apontado por pb (42).</span></pre></td></tr></table></div>

<p style="text-align: justify;">As linhas 18 e 19 declaram respectivamnete dois inteiros e dois ponteiros para inteiros.</p>
<p style="text-align: justify;">As linhas 23 a 26 mostram os endereços das minhas variáveis. Esses endereços foram dados pelo sistema operacional e são fixos enquanto essas variáveis existirem. Uma variável não muda de endereço durante a execução do programa, mas pode mudar entre uma execução e outra. Quem define qual é esse endereço é o sistema operacional no momento da execução do programa. O compilador só sabe que serão necessários x bytes para cada variável, e qual a interpretação (tipo) que o programa vai dar a esse espaço.</p>
<p style="text-align: justify;">As linhas 30 a 33 mostram os conteúdos dessas variáveis, que ainda não foram inicializadas. É lixo, o último valor que alguém (não sei quem) colocou naqueles lugares da memória do computador e que agora pertencem às minhas variáveis.</p>
<p style="text-align: justify;">Note que não é seguro descomentar as linhas 36 e 37 pois elas tentam acessar os conteúdos apontados por pa e pb, que ainda não foram inicializados. Durante essa tentativa, o programa vai tentar interpretar aqueles valores de lixo aleatório como se fossem endereços de variáveis int válidos. Dependendo do compilador, do SO utilizado e da sua sorte, pode ser algo inofensivo ou não. O certo é que o resultado dessas linhas é imprevisível e fonte certa de problemas.</p>
<p style="text-align: justify;">Nas linhas 41 e 42 os ponteiros são inicializados com os endereços das variáveis inteiras a e b. A partir daí os prints são repetidos.</p>
<p style="text-align: justify;">Veja que os endereços dos ponteiros não mudam, o que já era esperado. O que mudam são os seus conteúdos. As variáveis pa e pb recebem os endereços de a e b respectivamente. Note que o conteúdo dos ponteiros é exatamente o valor do endereço das variáveis a e b que foram dados pelo SO no início do programa. Confira com os prints anteriores. O conteúdo apontado por pa e pb é o mesmo conteúdo de a e b, que ainda não foram inicializados, ou seja, lixo. Porém, diferentemente da etapa anterior, agora os ponteiros apontam para endereços válidos (os endereços de a e b) e ainda que os conteúdos de a e b sejam lixo de memória, os ponteiros agora apontam para variáveis que já foram alocadas.</p>
<p style="text-align: justify;">Nas linhas 61 e 62 as variáveis inteiras são inicializadas com os valores 10 e 13, e os prints repetidos denovo.</p>
<p style="text-align: justify;">Desta vez os coteúdos de a e b não são mais lixo. São valores devidamente conhecidos. Note que não há nenhuma alteração no endereçamento das variáveis em relação às etapas anteriores, apenas nos valores.</p>
<p style="text-align: justify;">Veja também que depois que a e b foram inicializados, o conteúdo apontado por pa e pb também foram alterados automaticamente. Isto acontece justamente porque pa e pb apontam para as mesmas áreas de memória utilizadas pelas variáveis pa e pb. Isso significa que o conteúdo apontado por um ponteiro pode ser modificado alterando-se o conteúdo das variáveis originais apontadas por ele. E finalmente as linhas 81 a 97 mostram que o inverso também vale, ou seja, alterando-se o conteúdo apontado por um ponteiro, altera-se automaticamente o conteúdo das variáveis originais apontadas por eles.</p>
<p style="text-align: justify;">É mais fácil entender isso pensando nas frases em português do que olhando para o código.</p>
<h2>Por enquanto&#8230;</h2>
<p style="text-align: justify;">Este foi o básico da operação com ponteiros. Ainda existem coisas interessantes para serem vistas, como ponteiros para funções, por exemplo, mas isso já é considerado um tópico mais avançado. Na sequência desta série, que está planejada para 4 posts, veremos referências, diferenças e semelhanças entre ponteiros e referências e por último ponteiros para funções.</p>
<h2>Links</h2>
<p style="text-align: justify;">
<ul>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/ponteiros.zip">ponteiros.zip</a> (todos os fontes do post);</li>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/01-declaracao.cpp">01-declaracao.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/02-tamanhos.cpp">02-tamanhos.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/03-utilizando.cpp">03-utilizando.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/04-pegadinha.cpp">04-pegadinha.cpp</a></li>
<li><a href="http://src.blabos.org/blog/posts/2009/04/19/05-enderecos.cpp">05-enderecos.cpp</a></li>
<li><a href="http://www.cplusplus.com/doc/tutorial/pointers/">Ponteiros no cplusplus.com</a></li>
<li><a href="http://www.research.att.com/~bs/">O Culpado</a></li>
</ul>
<p class="buymebeer"><form action="https://www.paypal.com/cgi-bin/webscr" target="paypal" method="post"><input type="hidden" name="cmd" value="_xclick" /><input type="hidden" name="business" value="blabos@blabos.org" /><input type="hidden" name="return" value="" /><input type="hidden" name="item_name" value="Buy Me a Beer for Ponteiros e referências em C++ parte 1" /><input type="hidden" name="currency_code" value="" /><input type="hidden" name="amount" value="" /><input type="image" src="http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif" align="left" alt="" title="" hspace="3" /></form><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+Ponteiros+e+referências+em+C+++parte+1" target="paypal">If you liked this post, buy me a beer</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/04/ponteiros-e-referencias-em-c-parte-1/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>As 20 linhas da vergonha</title>
		<link>http://blog.blabos.org/2009/04/as-20-linhas-da-vergonha/</link>
		<comments>http://blog.blabos.org/2009/04/as-20-linhas-da-vergonha/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 15:20:49 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Opinião]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=457</guid>
		<description><![CDATA[Enquanto o arroz vai cozinhado, lembrei-me de um caso curioso que aconteceu comigo no início da carreira, envolvendo gerenciamento de memória em C++. Naquela época, eu era muito mais. Mais jovem, mais rápido, mais arrogante e mais newbie&#8230;


Um colega de trabalho mais experiente estava explicando para um outro colega menos experiente que para cada new [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Enquanto o arroz vai cozinhado, lembrei-me de um caso curioso que aconteceu comigo no início da carreira, envolvendo gerenciamento de memória em C++. Naquela época, eu era muito mais. Mais jovem, mais rápido, mais arrogante e mais newbie&#8230;</p>
<p style="text-align: justify;">
<p><span id="more-457"></span></p>
<p style="text-align: justify;">Um colega de trabalho mais experiente estava explicando para um outro colega menos experiente que para cada <strong>new</strong> deve haver um respectivo <strong>delete</strong>. Caso contrário o objeto persistirá em memória podendo ocorrer memory leaks.</p>
<p style="text-align: justify;">Nesse momento eu o interrompi e disse que &#8220;não necessariamente, pois basta que o objeto saia de escopo para que o destrutor seja chamado automaticamente.&#8221;.</p>
<p style="text-align: justify;">A partir daí rolou uns 10 min de debate com argumentos e contra-argumentos, tendo toda a equipe parada assistindo. No final, metade da equipe concordava com ele e a outra metade comigo, e naquele momento ninguém tinha na cabeça uma forma de checar pra ver. Olhar na internet não era uma opção.</p>
<p style="text-align: justify;">Como eu tinha todas as respostas, afinal já programava em PHP, Java e C++ fiquei de demonstrar posteriormente que eu estava certo.</p>
<p style="text-align: justify;">Dias depois, num daqueles momentos filosóficos, lembrei que um endereço na memória é um número, e que é possível tanto converter um endereço para um número comum, quanto fazer o caminho inverso, embora a segunda opção normalmente seja inútil.</p>
<p style="text-align: justify;">Bolei então uma forma de provar a minha teoria: Criaria um objeto num escopo restrito alocando com new. Guardaria o endereço desse objeto como um número comum num <strong>long</strong> fora do escopo restrito, esperaria o escopo restrito finalizar, o destrutor do obejto ser chamado e então, no escopo externo, usaria o número que representava o endereço do objeto para acessar aquela área de memória mostrando que receberia um <strong><a href="http://en.wikipedia.org/wiki/SIGSEGV">SIGSEGV</a></strong> (segmentation fault) por tentar acessar uma área de memória inválida. Gerei então o código abaixo.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> argc, <span style="color: #0000ff;">char</span><span style="color: #000040;">**</span> argv<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> num <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #008000;">&#123;</span>
        string<span style="color: #000040;">*</span> str <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> string<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Hello World!!!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
        num <span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span><span style="color: #008000;">&#41;</span>str<span style="color: #008080;">;</span>
&nbsp;
        <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;str: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> str <span style="color: #000080;">&lt;&lt;</span>  endl<span style="color: #008080;">;</span>
        <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;num: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> num <span style="color: #000080;">&lt;&lt;</span>  endl<span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>string<span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>num<span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: justify;">Eis que para minha surpresa o programa <strong>NÃO</strong> explodiu na minha cara. Ele funcionava corretamente demonstrando que na verdade <strong>EU</strong> era quem estava errado.</p>
<p style="text-align: justify;">Pesquisando mais constatei que sim, para cada <strong>new</strong> deve haver um e somente <strong>delete</strong>, e mais, para cada <strong>new[]</strong> deve haver um e somente um <strong>delete[]</strong>. O que eu achava que sabia sobre gerenciamento de memória e escopos, provavelmente era alguma confusão entre diferentes linguagens.</p>
<p style="text-align: justify;">Quando eu iniciei a discussão dias antes, eu cometi todos os erros básicos que um newbie comete:</p>
<ol style="text-align: justify;">
<li>Se meter onde não foi chamado.</li>
<li>Jurar de pé junto que está certo sem ter provas.</li>
<li>Subestimar o conhecimento de alguém mais experiente.</li>
<li>Achar que tem todas as respostas só porque acabou de ver isso na aula.</li>
<li>Achar que só porque conhece o básico de várias linguagens, então tem todas as respostas.</li>
</ol>
<p style="text-align: justify;">Como todo bom integrante da espécie dos <a href="http://en.wikipedia.org/wiki/Homo_sapiens">Homo sapiens</a>, falei merda. A minha reação a esta descoberta foi assumir para e equipe inteira que eu estava errado, pedir desculpas por ter falado besteira e mostrar essas vinte linhas de código que usei para demonstrar isso. Além disso, mostrei todas as fontes que pesquisei, e ainda trouxe à tona outros detalhes sobre gerenciamento de memória que nos estavam escapando, como <a href="http://en.wikipedia.org/wiki/Circular_reference#Circular_references_in_computer_programming">referências circulares</a>. Isso levou até a um re-desing de algumas partes do projeto.</p>
<p style="text-align: justify;">As minhas 20 linhas de cógigo ficaram conhecidas como &#8220;As 20 linhas da vergonha&#8221; e natualmente eu fui sacaneado por isso. Cada vez que alguém tinha alguma dúvida falavam &#8220;faz aí as 20 linhas da vegonha pra testar&#8221;. O significado era mais ou menos como &#8220;faz aí um teste simples pra não passar vergonha depois&#8221;.</p>
<p style="text-align: justify;">O mais importante é que a minha atitude pós-cagada foi bem aceita e trouxe benefícios para a equipe. Se eu tivesse me esquivado, mais cedo ou mais tarde alguém ia provar que eu estava errado na frente de todo mundo, ou pior, nos bastidores. Admitir o erro e aprender com isso mostrou que eu estava preparado para ser contestado. Adicionalmente isso mostrou para equipe que por mais que eu parecesse arrogante (eu pareço mais do que sou&#8230;), eu sabia que era um humano comum, que errava como qualquer um, não me achando superior a ninguém. Isso abriu caminho para que outros membros da equipe se sentissem à vontade para fazer o mesmo e nós nos tornamos uma equipe ainda mais coesa.</p>
<p class="buymebeer"><form action="https://www.paypal.com/cgi-bin/webscr" target="paypal" method="post"><input type="hidden" name="cmd" value="_xclick" /><input type="hidden" name="business" value="blabos@blabos.org" /><input type="hidden" name="return" value="" /><input type="hidden" name="item_name" value="Buy Me a Beer for As 20 linhas da vergonha" /><input type="hidden" name="currency_code" value="" /><input type="hidden" name="amount" value="" /><input type="image" src="http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif" align="left" alt="" title="" hspace="3" /></form><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+As+20+linhas+da+vergonha" target="paypal">If you liked this post, buy me a beer</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/04/as-20-linhas-da-vergonha/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Instalando e integrando Eclipse, CDT, Qt, Subversion, Perl, Vim e Web Tools somente com o mouse</title>
		<link>http://blog.blabos.org/2009/02/instalando-e-integrando-eclipse-cdt-qt-subversion-perl-vim-e-web-tools-somente-com-o-mouse/</link>
		<comments>http://blog.blabos.org/2009/02/instalando-e-integrando-eclipse-cdt-qt-subversion-perl-vim-e-web-tools-somente-com-o-mouse/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 03:00:05 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Eee]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[VIM]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=391</guid>
		<description><![CDATA[Há muito tempo atrás em um post nem tão longe daqui, nós mostramos como instalar o eclipse com plugins para desenvolvimento em Qt e integrando com o Subversion. Mas o tempo passa, as versões mudam e tudo fica diferente, e desta vez vamos mostrar como fazer isso apenas com cliques e num Eee Pc.

É claro [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Há muito tempo atrás em um <a href="http://blog.blabos.org/2008/05/eclipseqtsvn/">post</a> nem tão longe daqui, nós mostramos como instalar o eclipse com plugins para desenvolvimento em Qt e integrando com o Subversion. Mas o tempo passa, as versões mudam e tudo fica diferente, e desta vez vamos mostrar como fazer isso apenas com cliques e num Eee Pc.</p>
<p><span id="more-391"></span></p>
<p style="text-align: justify;">É claro que não é o tipo de coisa que deve ser usada para torturar um netbook, pois ele não foi desenhado para ser uma estação de desenvolvimento. Tanto é que ao final da instalação acabou o espaço disponível em disco, que já não era muito. Em termos de desempenho também não fica lá essas coisas, afinal é um NETbook, não un NOTEbook.</p>
<h2>Passo #0: Instalação do Java</h2>
<p style="text-align: justify;">Desta vesta vez ao invés de instalar a JRE na mão, utilizamos o synaptic, onde é só mandar procurar, clicar e instalar. Eu me contento com as versões disponíveis do java. Para maiores detalhes, seguem os links habituais: <a href="http://java.sun.com/javase/downloads/index.jsp">Download do Java</a> e <a href="http://java.sun.com/javase/6/webnotes/install/index.html">Dicas de Instalação</a>.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/synaptic-java.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_synaptic-java.png" /></a></p>
<h2>Passo #1: Instalação do Eclipse</h2>
<p style="text-align: justify;">Eu vou continuar baixando e instalando o eclipse diretamente do seu <a href="http://www.eclipse.org/downloads">site</a>, pois a versão disponibilizada via synaptic é velha demais para mim <img src='http://blog.blabos.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Eu preferi o eclipse SDK, aquele que vem com o Java ao invés do CDT. Mas você pode escolher qualquer um.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/eclipse.org.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_eclipse.org.png" /></a></p>
<p style="text-align: justify;">Feito o download, um duplo clique no arquivo abre o descompactador. Daí é só mandar extrair em algum diretório à sua escolha. Eu preferi deixar no ~/local, já que ficando no meu home, não vou precisar de permissão de administrador para instalar.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/03-install.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_03-install.png" /></a></p>
<p style="text-align: justify;">Eu também precisei <a href="http://gnome-look.org/content/show.php/Eclipse+IDE+icon?content=20398">baixar o ícone</a>, pois ou no pacote não tem, ou está escondido demais para mim.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/05-install.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_05-install.png" /></a></p>
<h2>Passo #2: Instalando o CDT</h2>
<p style="text-align: justify;">Para isso bastar abrir o eclipse e ir em Help&gt;Softwares Updates procurar po cdt e mandar ver na instalação. Ao terminar, o eclipse pede para ser reiniciado. Como pessoa bondosa que sou eu respondo sim cada vez que ele me pergunta.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/06-cdt.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_06-cdt.png" /></a></p>
<h2>Passo #3: Integração com o Subversion</h2>
<p style="text-align: justify;">Esse é um pouco menos fácil. Vá em Help&gt;Softwares Updates e procure por, advinhe? mylyn. Pra começar a brincadeira isso vai ser necessário para a instalação da integração com Subversion. Daí o de sempre, next, nex, install. Depois, Help&gt;Softwares Updates procure por svn e mais uma vez, next, next, install. O problema é que isso vai instalar somente a integração (???), ainda faltam os conectores (???), ou seja, integra, mas não integra tanto assim&#8230;</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/08-mylyn.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_08-mylyn.png" /></a></p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/07-subversive.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_07-subversive.png" /></a></p>
<p style="text-align: justify;">A instalação dos conectores é feita via um <a href="http://www.polarion.org/index.php?page=installation&#038;project=subversive#install">site próprio</a>. Mas cuidado agora, a menos que você esteja no windows, evite os pacores win32, óbvio. Isso vai te poupar muitas dores de cabeça, pois o eclipse é meio tímido quando o assunto é sobre os erros. Feito isso, next, next, install, e reiniciar o eclipse denovo&#8230;</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/10-connector.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_10-connector.png" /></a></p>
<h2>Passo #4: Integração com Perl</h2>
<p style="text-align: justify;">A integração com Perl é bem simples de ser instalada, bastando adicionar o <a href="http://www.epic-ide.org">site do EPIC</a> e mandar ver no next, next, install&#8230;</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/13-epic.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_13-epic.png" /></a></p>
<h2>Passo #5: Qt Eclipse Integration</h2>
<p style="text-align: justify;">Pra variar, nada de next, next, intall. Desta vez, é baixar do site da <del>TrollTech</del> <a href="http://www.qtsoftware.com/developer/eclipse-integration">Qt Software</a>, duplo clique e mandar descompactar no mesmo diretório que o eclipse foi descompactado, no meu caso ~/local. Nâo é dentro do diretório do eclipse, é fora, no mesmo nível, pois o arquivo da integração com o Qt vai criar um diretório eclipse/ onde for descompactado e esse diretório precisa combinar com o diretório do eclipse.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/14-qt-eclipse-integration.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_14-qt-eclipse-integration.png" /></a></p>
<h2>Passo #6: Web Tools</h2>
<p style="text-align: justify;">Ultimamente eu ando me arriscando denovo no mundo do desenvolvimento web com o Catalyst. Por isso algumas ferramentas como um editor de html ajudam muito. Eu usava o kate, mas agora descobri os plugins do próprio eclipse. Então, mãos à obra, pra variar, Help&gt;Softwares Updates, procurar por web e então next, next, install.</p>
<p style="text-align: center;"><a href="http://img.blabos.org/blog/posts/2009/02/eclipse/17-web.png"><img border="1" src="http://img.blabos.org/blog/posts/2009/02/eclipse/thumb_17-web.png" /></a></p>
<h2>Passo #7: Vim Plugin</h2>
<p style="text-align: justify;">Por último e não menos importante não dá pra deixar o Eclipse completo, sem integrá-lo com o mais importante IDE de todos os tempos, <strong>o VIM</strong>.</p>
<p style="text-align: justify;">Por ser o Vim uma ferramenta de &#8220;modo texto&#8221;, a instalação do <a href="http://vimplugin.org/installation">Vim Plugin</a> não tem screen shots <img src='http://blog.blabos.org/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  . Mas não se preocupem, basta acessar o site dele e seguir as poucas intruções. Não se esqueçam de marcar no eclipse a opção &#8216;Embed Vim&#8217; pois senão ao abrir os arquivos ele vai abrir uma janela nova.</p>
<h2>Considerações Finais</h2>
<p style="text-align: justify;">A nova versão do Eclipse, Ganymede, está bem mais produtiva e fácil de instalar. Já é até possível instalar a maioria dos plugins sem muita dor de cabeça. A integração com o Qt e Subversion, por exemplo, são duas mãos na roda principalmente para os desenvolvedores independentes. As ferramentas de edição de HTML, apesar de deixarem um pouco a desejar, também estão muito boas.</p>
<p style="text-align: justify;">Para o meu workspace ser perfeito só faltava o Eclipse ser bonito como o <a href="http://labs.trolltech.com/blogs/category/qtcreator/">QtCreator</a>, o EPIC funcionar como a parte do <a href="http://padre.perlide.org/">Padre</a> que funciona e o plugin do VIM ser um pouco mais decente, mas afinal não dá pra copiar o VIM, né&#8230;</p>
<h2>Links Interessantes</h2>
<p style="text-align: justify;">
<ul>
<li><a href="http://www.eclipse.org">Eclipse.org</a></li>
<li><a href="http://www.qtsoftware.com/">Qt Software</a></li>
<li><a href="http://labs.trolltech.com/blogs/category/qtcreator/">QtCreator</a></li>
<li><a href="http://www.polarion.org/index.php?page=overview&#038;project=subversive">Polarion Community</a></li>
<li><a href="http://svnbook.red-bean.com/">SVN Redbook</a></li>
<li><a href="http://www.epic-ide.org/">EPIC &#8211; Eclipse Perl Integration</a></li>
<li><a href="http://padre.perlide.org/">Padre &#8211; Perl IDE</a></li>
<li><a href="http://vimplugin.org/">VIM Plugin</a></li>
</ul>
<p class="buymebeer"><form action="https://www.paypal.com/cgi-bin/webscr" target="paypal" method="post"><input type="hidden" name="cmd" value="_xclick" /><input type="hidden" name="business" value="blabos@blabos.org" /><input type="hidden" name="return" value="" /><input type="hidden" name="item_name" value="Buy Me a Beer for Instalando e integrando Eclipse, CDT, Qt, Subversion, Perl, Vim e Web Tools somente com o mouse" /><input type="hidden" name="currency_code" value="" /><input type="hidden" name="amount" value="" /><input type="image" src="http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif" align="left" alt="" title="" hspace="3" /></form><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+Instalando+e+integrando+Eclipse,+CDT,+Qt,+Subversion,+Perl,+Vim+e+Web+Tools+somente+com+o+mouse" target="paypal">If you liked this post, buy me a beer</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2009/02/instalando-e-integrando-eclipse-cdt-qt-subversion-perl-vim-e-web-tools-somente-com-o-mouse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Membros privados em estruturas C</title>
		<link>http://blog.blabos.org/2008/05/membros-privados-em-estruturas-c/</link>
		<comments>http://blog.blabos.org/2008/05/membros-privados-em-estruturas-c/#comments</comments>
		<pubDate>Mon, 19 May 2008 00:08:31 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=38</guid>
		<description><![CDATA[Esta semana, lá no trabalho tive mais uma prova de que paradigma de programação é algo completamente independente de linguagem, ou seja, não é pelo fato de você estar programando em C++, compilando com o g++ que o seu código vai ser orientado a objetos, tão pouco, se você programa em ANSI C o seu [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Esta semana, lá no trabalho tive mais uma prova de que paradigma de programação é algo completamente independente de linguagem, ou seja, não é pelo fato de você estar programando em C++, compilando com o g++ que o seu código vai ser orientado a objetos, tão pouco, se você programa em ANSI C o seu código obrigatoriamente vai ser estruturado ou você estará impedido de programar orientado a objetos.</p>
<p><span id="more-38"></span></p>
<p style="text-align: justify;">Estou lendo certo, Orientação a Objetos em ANSI C?</p>
<p style="text-align: justify;">Sim e não!</p>
<p style="text-align: justify;">Coisas como herança, polimorfismo e sobrecarga são complicadas de fazer/emular em C, mas você pode programar utilizando um estilo que se comporte de forma semelhante à orientação a objetos. A <a href="http://www.directfb.org">libdfb</a> é escrita em C mas &#8220;orientada a objetos&#8221;, de forma que você cria, manipula de destrói elementos que se comportam de forma bem semelhante a objetos.</p>
<p style="text-align: justify;">Aqui no trabalho, temos um sistema de abstração de hardware em C que se conecta com uma GUI em C++. A camada mais baixa, em C também foi escrita (e muito bem escrita, diga-se de passagem) com essas técnicas, simulando uma orientação a objetos. Uma dessas técnicas, me chamou atenção por usar uma daquelas notas de rodapé dos livros de C.</p>
<p style="text-align: justify;">Ao compilar código em C, cada símbolo só tem visibilidade dentro da unidade de compilação na qual ele foi declarado, a menos que seja declarado novamente nas outras unidades como <strong>extern</strong>. Dessa forma, é possível &#8220;esconder&#8221; certos símbolos dentro de sua unidade de compilação, tornando-os inacessíveis ao mundo exterior. Temos com isso encapsulamento.</p>
<p style="text-align: justify;">A unidade de compilação é o conjunto de arquivos que depois de pre-processados e compilados geram um único código objeto. Basicamente (mas não exatamente), podemos tomar como unidade de compilação cada arquivo de implementação de código fonte (*.c, *.cpp. etc). Maiores detalhes sobre as <a href="http://www.caloni.com.br/blog/archives/os-diferentes-erros-na-linguagem-c">etapas de compilação em C e C++</a> podem ser encontrados no <a href="http://www.caloni.com.br">blog do Caloni</a>.</p>
<p style="text-align: justify;">Utilizando essas informações, podemos criar uma struct em ANSI C na qual os seus membros internos são &#8220;privados&#8221;. A mágica está em aprisionar a definição dos membros dentro da unidade de compilação e criar métodos de acesso para esses membros. Para isso usamos as notas de rodapé que nos mostram a diferença entre declaração e definição de elementos em C:</p>
<p style="text-align: justify;"><strong>Declaração ou manifesto</strong>: Apresenta ao compilador um identificador sem dizer muito sobre seu significado, ou seja, diz ao compilador que o identificador XXX existe, mas pouco se sabe sobre o que ele representa.<br />
Ex.:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">extern</span> <span style="color: #993333;">int</span> a<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> bla<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">struct</span> st_data<span style="color: #339933;">;</span></pre></div></div>

<p style="text-align: justify;"><strong>Definição ou implementação</strong>: Diz ao compilador o que determinado identificador representa, como por exemplo quanto de memória deve ser alocada para ele e qual o endereço de memória onde podemos encontrá-lo, entre outras coisas.<br />
Ex.:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> a<span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> bla<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #808080; font-style: italic;">/* Do anything.  */</span><span style="color: #009900;">&#125;</span>
<span style="color: #993333;">struct</span> st_data <span style="color: #009900;">&#123;</span><span style="color: #808080; font-style: italic;">/* Some members. */</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Quando falamos de estruturas e tipos, sem a definição o compilador não tem como alocar memória para eles pois nada se sabe a respeito de quanto espaço uma variável daquele tipo precisa. Por outro lado, algumas vezes, sem a declaração, o linker não tem como saber que aquele símbolo existe.</p>
<p style="text-align: justify;">Quando declaramos uma estrutura num cabeçalho, normalmente nós também definimos seus membros ali mesmo e toda vez que adicionamos esse cabeçalho a um fonte nosso, nós incluimos na unidade de compilação desse fonte tanto a declaração quanto a definição dessa estrutura, tornando os membros da estutura públicos à essa unidade de compilação. Isso nos permite acessar seus membros diretamente.</p>
<p style="text-align: justify;">Se separarmos a declaração da definição, somente símbolo que representa a estrutura estará disponível, mas não os seus membros. Assim, qualquer tentativa de acesso direto a um membro, gerará um erro de compilação. Um efeito colateral interessante é que como o compilador nada sabe sobre o tamanho da estrutura, não será possível definir diretamente uma variável do tipo da estrutura, somente um ponteiro para ela, pois ponteiros têm todos o mesmo tamanho e o compilador precisa apenas do nome símbolo do tipo para criar o ponteiro.</p>
<p style="text-align: justify;">Temos então o header mytype.h mais ou menos assim:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#ifndef MY_TYPE_H</span>
<span style="color: #339933;">#define MY_TYPE_H</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* O typedef é apenas pra não ficar repetindo a palavra struct. */</span>
<span style="color: #808080; font-style: italic;">/* A declaração é somente o trecho:                             */</span>
<span style="color: #808080; font-style: italic;">/* struct _mytype                                               */</span>
<span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> _mytype my_type<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> create_my_type<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">**</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> destroy_my_type<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">**</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> set_data<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">*</span> <span style="color: #339933;">,</span> <span style="color: #993333;">int</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> get_data<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">*</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">void</span> set_text<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">*</span> <span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">char</span><span style="color: #339933;">*</span> get_text<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">*</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #339933;">#endif</span></pre></div></div>

<p style="text-align: justify;">A implementação mytype.c:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;mytype.h&quot;</span>
&nbsp;
<span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
&nbsp;
<span style="color: #993333;">struct</span> _mytype <span style="color: #009900;">&#123;</span>        <span style="color: #808080; font-style: italic;">/* Aqui fica a definição da estrtura. */</span>
    <span style="color: #993333;">int</span> data<span style="color: #339933;">;</span>           <span style="color: #808080; font-style: italic;">/* Somente depois disso é que o com-  */</span>
    <span style="color: #993333;">int</span> text<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">21</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>       <span style="color: #808080; font-style: italic;">/* pilador vai saber como alocá-la.   */</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>                      <span style="color: #808080; font-style: italic;">/* Tente um sizeof(my_type) no main.  */</span>
&nbsp;
<span style="color: #993333;">void</span> create_my_type<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">**</span> my_ptr <span style="color: #009900;">&#41;</span>             <span style="color: #009900;">&#123;</span> <span style="color: #808080; font-style: italic;">/* some code... */</span> <span style="color: #009900;">&#125;</span>
<span style="color: #993333;">void</span> destroy_my_type<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">**</span> my_ptr <span style="color: #009900;">&#41;</span>            <span style="color: #009900;">&#123;</span> <span style="color: #808080; font-style: italic;">/* some code... */</span> <span style="color: #009900;">&#125;</span>
<span style="color: #993333;">void</span> set_data<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">*</span> my_ptr <span style="color: #339933;">,</span> <span style="color: #993333;">int</span> d <span style="color: #009900;">&#41;</span>            <span style="color: #009900;">&#123;</span> <span style="color: #808080; font-style: italic;">/* some code... */</span> <span style="color: #009900;">&#125;</span>
<span style="color: #993333;">int</span> get_data<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">*</span> my_ptr <span style="color: #009900;">&#41;</span>                     <span style="color: #009900;">&#123;</span> <span style="color: #808080; font-style: italic;">/* some code... */</span> <span style="color: #009900;">&#125;</span>
<span style="color: #993333;">void</span> set_text<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">*</span> my_ptr <span style="color: #339933;">,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> text <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #808080; font-style: italic;">/* some code... */</span> <span style="color: #009900;">&#125;</span>
<span style="color: #993333;">char</span><span style="color: #339933;">*</span> get_text<span style="color: #009900;">&#40;</span> my_type<span style="color: #339933;">*</span> my_ptr <span style="color: #009900;">&#41;</span>                   <span style="color: #009900;">&#123;</span> <span style="color: #808080; font-style: italic;">/* some code... */</span> <span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">O código fonte completo do exemplo pode ser encontrado <a href="http://src.blabos.org/blog/posts/38/private-struct-members.zip">aqui</a>.</p>
<p style="text-align: justify;">Como não é possível criar diretamente variáveis desse tipo, precisamos definir um &#8220;construtor&#8221; e um &#8220;destrutor&#8221;.</p>
<p style="text-align: justify;">Tentativas de acesso direto a membros geram erro de compilação:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user<span style="color: #000000; font-weight: bold;">@</span>host:~<span style="color: #000000; font-weight: bold;">/</span>private-struct-members$ <span style="color: #c20cb9; font-weight: bold;">gcc</span> <span style="color: #660033;">-o</span> teste mytype.h mytype.c main.c
main.c: Na função ‘main’:
main.c:<span style="color: #000000;">22</span>: erro: dereferencing pointer to incomplete <span style="color: #7a0874; font-weight: bold;">type</span>
user<span style="color: #000000; font-weight: bold;">@</span>host:~<span style="color: #000000; font-weight: bold;">/</span>private-struct-members$</pre></div></div>

<p style="text-align: justify;">Dessa forma, com um pouco de criatividade e tendo os conceitos tanto da linguagem quanto dos paradigmas, é possível implementar códigos realmente interessantes. Neste exemplo bobo talvez não tenha ficado clara a utilidade de forçar uma emulação de encapsulamento ou o uso de construtor/destrutor em C, mas em sistemas onde as circunstâncias não permitem um C++, ou que a complexidade tenda a atingir níveis críticos, essas técnicas se mostram de grande valia. No nosso caso, essa técnica especificamente, permitiu que um programador experiente, que não participou do projeto todo, descobrisse que sua tentativa de acesso direto a um membro de uma estrutura, estava contextualmente inadequada. Sem isso, um bug cabuloso de lógica iria aparecer somente em tempo de execução, provavelmente fazendo o software explodir na cara do cliente.</p>
<p style="text-align: justify;">Links úteis (ou não&#8230;):<br />
<a href="http://www.directfb.org">http://www.directfb.org</a><br />
<a href="http://www.caloni.com.br">http://www.caloni.com.br</a><br />
<a href="http://www.numaboa.com.br/informatica/c/">http://www.numaboa.com.br/informatica/c/</a><br />
<a href="http://www.lcm.com.br/index.php?Escolha=20&amp;Livro=L00581">Livro Desenvolvimento do Kernel do Linux</a></p>
<p class="buymebeer"><form action="https://www.paypal.com/cgi-bin/webscr" target="paypal" method="post"><input type="hidden" name="cmd" value="_xclick" /><input type="hidden" name="business" value="blabos@blabos.org" /><input type="hidden" name="return" value="" /><input type="hidden" name="item_name" value="Buy Me a Beer for Membros privados em estruturas C" /><input type="hidden" name="currency_code" value="" /><input type="hidden" name="amount" value="" /><input type="image" src="http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif" align="left" alt="" title="" hspace="3" /></form><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+Membros+privados+em+estruturas+C" target="paypal">If you liked this post, buy me a beer</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2008/05/membros-privados-em-estruturas-c/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Eclipse + Qt + svn</title>
		<link>http://blog.blabos.org/2008/05/eclipseqtsvn/</link>
		<comments>http://blog.blabos.org/2008/05/eclipseqtsvn/#comments</comments>
		<pubDate>Fri, 09 May 2008 11:00:21 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=37</guid>
		<description><![CDATA[Mais como log pessoal do que um tutorial, senti a necessidade de deixar num local de fácil acesso, as etapas de configuração do eclipse para meu próprio uso, ou seja, a instalação do eclipse e dos plugins que eu normalmente uso (svn e qt).
Os comandos que afetam diretórios fora de seu home, precisarão de permissão [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Mais como log pessoal do que um tutorial, senti a necessidade de deixar num local de fácil acesso, as etapas de configuração do eclipse para meu próprio uso, ou seja, a instalação do eclipse e dos plugins que eu normalmente uso (svn e qt).</p>
<blockquote><p><strong>Os comandos que afetam diretórios fora de seu home, precisarão de permissão de superusuário.</strong></p></blockquote>
<p align="justify">Se você resolveu instalar o eclipse apartir dos pacotes disponíveis em sua distribuição, pode pular direto para o passo #2.</p>
<h3>Passo #0: Instalação do Java</h3>
<p>Para que o eclipse funcione, vc precisa do Java Runtime Environment (JRE) instalado *E* configurado.</p>
<p align="justify">O JRE pode ser baixado direto do site da Sun <a href="http://java.sun.com/javase/downloads/index.jsp" class="snap_shots">http://java.sun.com/javase/downloads/index.jsp</a>. Instruções completas de instalação e configuração podem ser encontradas em <a href="http://java.sun.com/javase/6/webnotes/install/index.html"class="snap_shots">http://java.sun.com/javase/6/webnotes/install/index.html</a>, para o caso do JRE 6.</p>
<h3>Passo #1: Donwload e instalação do eclipse</h3>
<p align="justify">O eclipse pode ser facilmente baixado a partir da área de downloads no seu site oficial: <a href="http://www.eclipse.org/downloads" class="snap_shots">http://www.eclipse.org/downloads</a>. Após o download, basta descompactá-lo e sair usando. No meu caso eu usei:</p>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user<span style="color: #000000; font-weight: bold;">@</span>host$ <span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xvzf</span> eclipse-cpp-europa-winter-linux-gtk.tar.gz <span style="color: #660033;">-C</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span></pre></div></div>

</p>
<p align="justify">Se tudo deu certo o executável do eclipse estará em <strong>/usr/local/eclipse/eclipse</strong>, daí é só criar um link/atalho/whatever no seu ambiente gráfico favorito.</p>
<h3>Passo #2: Download e instalação do plugin de integração com o QT</h3>
<p align="center"><a href="http://img.blabos.org/blog/posts/37/qteclipse.png" class="snap_shots"><br />
<img src="http://img.blabos.org/blog/posts/37/qteclipse.png" alt="Qt Eclipse Integration" width="200" height="150" hspace="2" vspace="2" border="2" /></a><a href="http://img.blabos.org/blog/posts/37/qteclipseconfig.png" class="snap_shots"><img src="http://img.blabos.org/blog/posts/37/qteclipseconfig.png" alt="Qt Eclipse Configuration" width="200" height="150" hspace="2" vspace="2" border="2" /></a></p>
<p align="justify">O plugin que eu atualmente uso é o fornecido pela própria Trolltech. Nele você pode gerenciar os seus arquivos de projeto a partir de um pequeno editor gráfico, e ainda se preferir, tem acesso direto ao arquivo <strong>.pro</strong>.</p>
<p align="justify">O download pode ser feito a partir de <a href="http://trolltech.com/developer/downloads/qt/eclipse-integration-download" class="snap_shots">http://trolltech.com/developer/downloads/qt/eclipse-integration-download</a>, e a instalação cujas instruções completas podem ser encontradas em <a href="http://trolltech.com/developer/downloads/qt/qteclipse-installmanual" class="snap_shots">http://trolltech.com/developer/downloads/qt/qteclipse-installmanual</a>, é complicadíssima:</p>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user<span style="color: #000000; font-weight: bold;">@</span>host$ <span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-xvzf</span> qt-eclipse-integration-linux.x86-gcc3.3-1.4.0.tar.gz <span style="color: #660033;">-C</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span></pre></div></div>

</p>
<p align="justify">Se tudo deu certo, os arquivos do plugin foram copiados para o diretório <strong>/usr/local/eclipse/plugins</strong>.</p>
<blockquote><p><strong>Nota</strong>: Para quem optou pela instalação do eclipse através dos pacotes da distribuição, atenção!!! Dentro do arquivo compactado, há o diretório eclipse/plugins/, e dento dele os arquivos do plugin, que devem ser copiados para o diretório de plugins da instalação do seu eclipse, normalmente /usr/lib/eclipse/plugins.</p></blockquote>
<p align="justify">Após a instalação, inicie o eclipse com o comando:</p>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user<span style="color: #000000; font-weight: bold;">@</span>host$ <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>eclipse<span style="color: #000000; font-weight: bold;">/</span>eclipse <span style="color: #660033;">-clean</span></pre></div></div>

</p>
<p align="justify">Agora, vá em Window&gt;Preferences&gt;Qt e ajuste a versão e os &#8220;pathes&#8221;, de acordo com a sua instalação do Qt.</p>
<p align="justify">Para ficar mais cômodo, se você invoca o eclipse direto da linha de comando, adicione o diretório do seu executável na variável de ambiente $PATH, dentro de algum dos scripts de inicialização (.bash_profile)</p>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>eclipse</pre></div></div>

</p>
<h3>Passo #3: Subversion</h3>
<p align="justify">No eclipse vá em Help&gt;Softwares Updates&gt;Find and Install. Marke a opção Search for new features to install e clique em Next. Agora adicione os sites remotos:</p>
<p align="justify">Buckminster</p>
<p>http://download.eclipse.org/tools/buckminster/updates</p>
<p align="justify">SubClipse</p>
<p>http://subclipse.tigris.org/update_1.2.x</p>
<p align="justify">Marque os respectivos checkboxes, e clique em Finish. Depois de uma pequena consulta à internet, é só marcar o plugin e dependências e correr pro abraço.</p>
<p class="buymebeer"><form action="https://www.paypal.com/cgi-bin/webscr" target="paypal" method="post"><input type="hidden" name="cmd" value="_xclick" /><input type="hidden" name="business" value="blabos@blabos.org" /><input type="hidden" name="return" value="" /><input type="hidden" name="item_name" value="Buy Me a Beer for Eclipse + Qt + svn" /><input type="hidden" name="currency_code" value="" /><input type="hidden" name="amount" value="" /><input type="image" src="http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif" align="left" alt="" title="" hspace="3" /></form><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+Eclipse+++Qt+++svn" target="paypal">If you liked this post, buy me a beer</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2008/05/eclipseqtsvn/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Iniciando no QT, parte III &#8211; qmake e .pro</title>
		<link>http://blog.blabos.org/2008/05/iniciando-no-qt-parte-iii/</link>
		<comments>http://blog.blabos.org/2008/05/iniciando-no-qt-parte-iii/#comments</comments>
		<pubDate>Wed, 07 May 2008 11:00:05 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.blabos.org/?p=36</guid>
		<description><![CDATA[Neste terceiro post sobre QT vamos falar do utilitário qmake e dos arquivos de projeto *.pro. Vamos entender para que serve o qmake e como configurar diferentes tipos de projetos.
O qmake
O qmake é um utilitário que acompanha o framework QT. Sua função é parsear um arquivo de projeto (*.pro) e gerar um Makefile já com [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Neste terceiro post sobre QT vamos falar do utilitário qmake e dos arquivos de projeto <strong>*.pro</strong>. Vamos entender para que serve o qmake e como configurar diferentes tipos de projetos.</p>
<h3 align="left">O qmake</h3>
<p align="justify">O qmake é um utilitário que acompanha o framework QT. Sua função é parsear um arquivo de projeto (*.pro) e gerar um Makefile já com as regras do <a href="http://doc.trolltech.com/4.4/moc.html" class="snap_shots">moc</a>, <a href="http://doc.trolltech.com/4.4/uic.html" class="snap_shots">uic</a> e opções do QT embutidas. Sem ele por exemplo, teríamos que chamar o moc explicitamente para criar os arquivos moc_* e passar explicitamente para o compilador e linker, as opções corretas para incluir o QT aos nossos projetos.</p>
<p align="justify">A documentação oficial sobre o qmake e arquivos de projeto, pode ser encontrada <a href="http://doc.trolltech.com/4.4/qmake-manual.html" class="snap_shots">aqui</a>.</p>
<h3>Arquivos de projeto *.pro</h3>
<p align="justify">Para criar um arquivo de projeto simples pela linha de comando, entramos no diretório do projeto e digitamos:</p>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">user<span style="color: #000000; font-weight: bold;">@</span>host$ qmake <span style="color: #660033;">-project</span></pre></div></div>

<p align="justify">Feito isso, será criado um arquivo com o mesmo nome do diretório corrente, seguido da extensão <strong>.pro</strong>. Caso já existam nesse diretório arquivos reconhecidos pelo qmake, como arquivos de códigos fontes (.h, .cpp), forms (.ui), etc, eles serão automaticamente adicionados ao arquivo de projeto.</p>
<p align="justify">Criado o arquivo .pro, ao executarmos qmake sem argumentos ele tentará parsear um arquivo .pro com o mesmo nome do diretório corrente. Você ainda pode especificar um arquivo de projeto alternativo como argumento para o qmake. Se tudo deu certo, um arquivo Makefile foi criado, e com  um simples make, podemos compilar o projeto.</p>
<p align="justify">Os arquivos de projeto são arquivos de texto normais, contendo macros e diretivas que serão interpretadas pelo qmake para criar o Makefile. A lista completa de opções pode ser encontrada na documentação <a href="http://doc.trolltech.com/4.4/qmake-manual.html" class="snap_shots">online</a>. As mais comuns são:</p>
<p align="justify"><strong>TEMPLATE</strong>: Indicam o tipo de projeto. Use &#8216;app&#8217; para proramas executáveis ou &#8216;lib&#8217; para criar bibliotecas.</p>
<p align="justify"><strong>CONFIG</strong>: Adicionam opções diversas ao projeto. Entre elas, &#8216;debug&#8217; para adicionar informações de depuração, &#8217;staticlib&#8217; em conjunto com o template &#8216;lib&#8217;, para que abiblioteca criada seja estática (.a no linux).</p>
<p align="justify"><strong>TARGET</strong>: O nome e a localização do alvo, ou seja, do aplicativo ou biblioteca.</p>
<p align="justify"><strong>MOC_DIR</strong>: Diretório onde serão grados os arquivos moc_*. Útil para não poluir o diretório de códigos fontes.</p>
<p align="justify"><strong>OBJECTS_DIR</strong>: Complementar à opção anterior, indica o diretório onde serão gerados os aquivos de código objeto (*.o).</p>
<p align="justify"><strong>INCLUDEPATH</strong>: Diretórios externos onde existem headers que serão utilizados no projeto, como headers de bibliotecas externas.</p>
<p align="justify"><strong>DEPENDPATH</strong>: Diretórios de códigos fontes externos que serão utilizados pelo projeto.</p>
<p align="justify"><strong>HEADERS</strong>: Os arquivos de cabeçalho do projeto (*.h).</p>
<p align="justify"><strong>FORMS</strong>: arquivos de interface gerados com o QtDesigner (*.ui).</p>
<p align="justify"><strong>SOURCES</strong>: Os arquivos de implementação de código fonte do projeto (*.cpp).</p>
<p align="justify"><strong>LIBS</strong>: Bibliotecas externas utilizadas pelo projeto. -L indica o path para a biblioteca, e -l diz o nome da biblioteca.</p>
<p align="justify"><strong>QT</strong>: Módulos do QT que devem ser adicionados/excluidos do projeto. Se for passado &#8216;QT =&#8217; (QT igual vazio), nenhum módulo QT será utilizado no projeto.</p>
<p align="justify"><strong>SUBDIRS</strong>: Utilizado em conjunto com o template &#8217;subdirs&#8217;, indica os subdiretórios ons o qmake deve procurar por outros arquivos de projeto.</p>
<p align="justify">Com isso em mãos podemos criar algums projetos simples.</p>
<h4>Um aplicativo simples:</h4>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="qt" style="font-family:monospace;"># O primeiro caracter desta linha cria um comentário
# O nome deste arquivo é 'app.pro'
TEMPLATE     =  app            # Nosso template é um aplicativo chamado
TARGET       =  bin/myapp.bin  # myapp.bin, dentro do dir ./bin
MOC_DIR      =  tmp/moc        # Diretório para mocs, opcional
OBJECTS_DIR  =  tmp/obj        # Diretório para código objeto, opcional
HEADERS      += myclass.h      # Header da classe MyClass
SOURCES      += main.cpp      # Utilize  para organizar os arquivos em
                myclass.cpp    # várias linhas.</pre></div></div>

</p>
<h4>Uma biblioteca simples:</h4>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="qt" style="font-family:monospace;"># O nome deste arquivo é 'lib.pro'
TEMPLATE     =  lib            # Nosso template é uma biblioteca
CONFIG       += dll            # dinâmica, chamada
TARGET       =  lib/mylib      # mylib, dentro do dir ./lib
MOC_DIR      =  tmp/moc        # Diretório para mocs, opcional
OBJECTS_DIR  =  tmp/obj        # Diretório para código objeto, opcional
HEADERS      += myclass.h      # Header da classe MyClass
SOURCES      += myclass.cpp    # Implementação da classe MyClass</pre></div></div>

</p>
<h4>Um aplicativo que usa uma biblioteca externa:</h4>
<p align="justify">

<div class="wp_syntax"><div class="code"><pre class="qt" style="font-family:monospace;"># O nome deste arquivo é 'mixed.pro'
TEMPLATE     =  app            # Nosso template é um aplicativo chamado
TARGET       =  bin/myapp.lkd  # myapp.lkd, dentro do dir ./bin
MOC_DIR      =  tmp/moc        # Diretório para mocs, opcional
OBJECTS_DIR  =  tmp/obj        # Diretório para código objeto, opcional
INCLUDEPATH  += .              # Dir onde estão os Headers da lib externa
SOURCES      += main.cpp       # Implementação do aplicativo.</pre></div></div>

</p>
<h4>Diretórios aninhados:</h4>
<p align="justify">Para utilizarmos diretórios aninhados, precisamos de um arquivo de projeto no diretório atual, e outro no subdiretório.</p>
<p align="justify">No diretório atual, utilizamos as opções:</p>

<div class="wp_syntax"><div class="code"><pre class="qt" style="font-family:monospace;">TEMPLATE = subdirs
SUBDIRS  = [lista de subdirs para serem compilados em sequência]</pre></div></div>

</p>
<p align="justify">Caso seja fornecido apenas o nome do diretório, ele precisa conter uma arquivo de projeto com o seu próprio nome. É possível no entando, informar diretamente na lista de subdiretórios, um diretório seguido por um arquivo de projeto com quaquer nome.</p>
<p align="justify">O código fonte completo dos exemplos abordados neste tutorial pode ser encontrado <a href="http://src.blabos.org/blog/posts/36/qmake-test.tar.gz">aqui</a>.</p>
<h3>Concluindo</h3>
<p align="justify">O qmake é uma ferramenta simples e muito poderosa que facilita enormemente a vida de quem tem de gerenciar aŕvores de projeto complexas, mesmo que o projeto não utilize QT (basta acrescentar no final a opção &#8216;QT = &#8216;). Adicione a isso o fato de os arquivos de projeto terem uma sintaxe bastante simples e até certo ponto intuitiva. Se você precisar de ajustes mais finos, a documentação <a href="http://doc.trolltech.com/4.4/qmake-manual.html" class="snap_shots">online</a> lhe dará uma dezena de opções para se divertir.</p>
<p align="justify">Com QT ou sem QT, o qmake é sempre uma boa opção para gerenciamento de árvore de build.</p>
<p class="buymebeer"><form action="https://www.paypal.com/cgi-bin/webscr" target="paypal" method="post"><input type="hidden" name="cmd" value="_xclick" /><input type="hidden" name="business" value="blabos@blabos.org" /><input type="hidden" name="return" value="" /><input type="hidden" name="item_name" value="Buy Me a Beer for Iniciando no QT, parte III - qmake e .pro" /><input type="hidden" name="currency_code" value="" /><input type="hidden" name="amount" value="" /><input type="image" src="http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif" align="left" alt="" title="" hspace="3" /></form><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+Iniciando+no+QT,+parte+III+-+qmake+e+.pro" target="paypal">If you liked this post, buy me a beer</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2008/05/iniciando-no-qt-parte-iii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LSI-TEC abre vagas para programadores</title>
		<link>http://blog.blabos.org/2008/02/lsi-tec-abre-vagas-para-programadores/</link>
		<comments>http://blog.blabos.org/2008/02/lsi-tec-abre-vagas-para-programadores/#comments</comments>
		<pubDate>Tue, 26 Feb 2008 01:21:47 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[Bla Bla Bla]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blabos.org/blog/?p=23</guid>
		<description><![CDATA[O LSI-TEC, lado empresa do internacionalmente renomado Laboratório de Sitemas Integráveis da USP, está à procura de talentos para atuar no desenvolvimento de projetos relacionados a TV Digital.
 Requisitos:

Linguagens C, C++ ou Java;
Linux para sitemas embarcados;
Subversion;
Autotools;

 Local:
Universidade de São Paulo &#8211; Campus Cidade Universitária
Os interessados podem encaminhar seus currículos para:
Hilel Becher &#60;hilel@lsi.usp.br&#62;
Laboratório de Sistemas Integráveis [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">O <a href="http://www.lsitec.org.br" class="snap_shots">LSI-TEC</a>, lado empresa do internacionalmente renomado Laboratório de Sitemas Integráveis da USP, está à procura de talentos para atuar no desenvolvimento de projetos relacionados a TV Digital.</p>
<p align="justify"> <strong>Requisitos:</strong></p>
<ul>
<li>Linguagens C, C++ ou Java;</li>
<li>Linux para sitemas embarcados;</li>
<li>Subversion;</li>
<li>Autotools;</li>
</ul>
<p align="left"> <strong>Local:</strong><br />
Universidade de São Paulo &#8211; Campus Cidade Universitária</p>
<p align="left">Os interessados podem encaminhar seus currículos para:<br />
<strong>Hilel Becher &lt;hilel@lsi.usp.br&gt;</strong></p>
<p><a href="http://www.lsitec.org.br" class="snap_shots">Laboratório de Sistemas Integráveis Tecnológico</a><br />
<a href="http://www.lsi.org.br" class="snap_shots">Laboratório de Sistemas Integráveis</a></p>
<p class="buymebeer"><form action="https://www.paypal.com/cgi-bin/webscr" target="paypal" method="post"><input type="hidden" name="cmd" value="_xclick" /><input type="hidden" name="business" value="blabos@blabos.org" /><input type="hidden" name="return" value="" /><input type="hidden" name="item_name" value="Buy Me a Beer for LSI-TEC abre vagas para programadores" /><input type="hidden" name="currency_code" value="" /><input type="hidden" name="amount" value="" /><input type="image" src="http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif" align="left" alt="" title="" hspace="3" /></form><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+LSI-TEC+abre+vagas+para+programadores" target="paypal">If you liked this post, buy me a beer</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2008/02/lsi-tec-abre-vagas-para-programadores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Iniciando no QT, parte II &#8211; Sinais, Slots e Timers</title>
		<link>http://blog.blabos.org/2008/02/iniciando-no-qt-parte-ii-sinais-slots-e-timers/</link>
		<comments>http://blog.blabos.org/2008/02/iniciando-no-qt-parte-ii-sinais-slots-e-timers/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 09:59:25 +0000</pubDate>
		<dc:creator>blabos</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blabos.org/blog/?p=17</guid>
		<description><![CDATA[Neste post vou seguindo com a brincadeira de fazer pequenos tutoriais sobre o QT para iniciantes. Desta vez vou mostrar como criar nossos próprios sinais e slots e como manipular um timer.
O código fonte pode ser encontrado neste link.
O programa de exemplo será um cronômetro que vai utilizar a classe QTimer, uma das principais classes [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">Neste post vou seguindo com a brincadeira de fazer pequenos tutoriais sobre o QT para iniciantes. Desta vez vou mostrar como criar nossos próprios sinais e slots e como manipular um timer.</p>
<p align="justify">O código fonte pode ser encontrado neste <a href="http://src.blabos.org/blog/posts/17/stopwatch.zip">link</a>.</p>
<p align="justify">O programa de exemplo será um cronômetro que vai utilizar a classe <a href="http://doc.trolltech.com/4.3/qtimer.html" class="snap_shots">QTimer</a>, uma das principais classes do QT, e vai mostrar o tempo utilizando um display estilo LCD de calculadora com a classe <a href="http://doc.trolltech.com/4.3/qlcdnumber.html" class="snap_shots">QLCDNumber</a>.</p>
<h3>QT e os Timers</h3>
<p align="justify">O suporte mais básico a timers no QT é disponibilizado pela classe QObject, que fornece os métodos <a href="http://doc.trolltech.com/4.3/qobject.html#startTimer" class="snap_shots">QObject::startTimer()</a> e <a href="http://doc.trolltech.com/4.3/qobject.html#killTimer" class="snap_shots">QObject::killTimer()</a>. O primeiro método retorna um ID único de timer e o segundo finaliza o timer através desse ID.</p>
<p align="justify">Para que isso funcione, no entanto, o trecho de código que utiliza esse mecanismo precisa estar dentro de um &#8220;event loop&#8221;. A partir do momento que o timer for iniciado ele de tempos em tempos (timeout) faz com que a aplicação dispate um <a href="http://doc.trolltech.com/4.3/qtimerevent.html" class="snap_shots">QTimerEvent</a>, que interrompe o fluxo normal do programa até que o evento seja processado.</p>
<p align="justify">O tempo máximo de timeout não é delimitado, sendo possível criar timers com timeout de anos, porém, o tempo mínimo pode variar de sistema para sistema. No windows Vista o timer mínimo é de 10 ms enquanto no Linux 2.6.x isso é configurável (o default é 4 ms). O QT vai tentar entregar todos os eventos, conforme pedidos, mas caso o sistema não permita ele vai descartar os &#8220;excedentes&#8221;.</p>
<p align="justify">Timers também podem ser utilizados em threads, porém deve-se respeitar a condição de estar dentro de um event loop. Threads merecem um artigo à parte, como sempre&#8230;</p>
<p align="justify">A classe <a href="http://doc.trolltech.com/4.3/qtimer.html" class="snap_shots">QTimer</a> implementa timers de mais alto nível, possibilitando algumas funcionalidades. Uma delas é o <a href="http://doc.trolltech.com/4.3/qtimer.html#singleShot" class="snap_shots">QTimer::singleShot()</a>, que dispara um evento uma única vez.</p>
<p align="justify">Leia a extensa e repetitiva documentação, é chato, mas acredite, vai te poupar de muita QDorDeCabeca&#8230;</p>
<h3>Mais sobre Sinais e Slots</h3>
<p align="justify">Sinais e slots são utilizados para comunicação entre objetos, sendo uma das peças fundamentais do QT. Nesse sistema ao invés de se implementar callbacks para tratar eventos, utiliza-se o conceito de conectar sinais a slots, tornando a programação mais intuitiva.</p>
<p align="justify">Os sinais e slots são métodos de classe que são tratados pelo <a href="http://doc.trolltech.com/4.3/moc.html#moc" class="snap_shots">Meta-Object Compiler (moc)</a> antes do código fonte ser compilado. Eles têm declarações especiais que não são parte do padrão C++, por isso o moc fazum parsing e gera o código fonte compilável.</p>
<p align="justify">Ao executar o comando moc sobre qualquer classe que implemente sinais e slots, uma certa quantidade de código fonte é gerada. Com o uso do programa <a href="http://doc.trolltech.com/4.3/qmake-manual.html" class="snap_shots">qmake</a>, a chamada ao programa moc fica a cargo do Makefile, tornando-a transparente para o programador.</p>
<p align="justify">Para que uma classe possa implementar sinais e slots, ela precisa ter acesso ao <a href="http://doc.trolltech.com/4.3/metaobjects.html" class="snap_shots">Meta-Object System</a>. Por isso ela deve herdar da classe <a href="http://doc.trolltech.com/4.3/qobject.html" class="snap_shots">QObject</a> ou suas subclasses, e precisa ter a macro <a href="http://doc.trolltech.com/4.3/qobject.html#Q_OBJECT" class="snap_shots">Q_OBJECT</a> na sua área de declaração privada. Terminados os preparativos, sinais são declarados em uma seção &#8220;<strong>signals:</strong>&#8221; e slots em seções &#8220;<strong>[public|protected|private] slots:</strong>&#8220;.</p>
<p align="justify">Um slot, depois de declarado, é então definido como qualquer outro método comum, podendo ser explicitamente chamado como qualquer outro. Já os sinais, são um pouco mais delicados, e são apenas declarados e jamais definidos pelo programador. A razão? Esta mensagem no final da tentativa de compilação:</p>
<pre>
tmp/moc_mydisplay.o: In function `MyDisplay::signalPlay()':
~/stopwatch/tmp/moc_mydisplay.cpp:89: multiple definition of `MyDisplay::signalPlay()'
tmp/mydisplay.o:~/stopwatch/mydisplay.cpp:169: first defined here
collect2: ld returned 1 exit status
make: ** [stopwatch] Erro 1
</pre>
<p align="justify">Dentro do arquivo <strong>moc_mydisplay.cpp</strong> é gerado o seguinte código:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;"><span style="color: #888888;">// SIGNAL 0</span>
<span style="color: #0057AE;">void</span> MyDisplay<span style="color: #006E28;">::</span><span style="color: #2B74C7;">signalPlay</span><span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span>
<span style="color: #006E28;">&#123;</span>
    <span style="color: #22aadd;">QMetaObject</span><span style="color: #006E28;">::</span><span style="color: #2B74C7;">activate</span><span style="color: #006E28;">&#40;</span><span style="color: #000000; font-weight:bold;">this</span><span style="color: #006E28;">,</span> <span style="color: #006E28;">&amp;</span>staticMetaObject<span style="color: #006E28;">,</span> <span style="color: #B08000;">0</span><span style="color: #006E28;">,</span> <span style="color: #B08000;">0</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
<span style="color: #006E28;">&#125;</span></pre></div></div>

<p align="justify">Sim, o moc gera a definição dos sinais com chamadas a meta-métodos do QT. Portanto, definir o corpo de um sinal é ilegal no QT e vai gerar um erro de compilação por redefinição de método. Deixe que o moc cuida da implementação do sinal pra você.</p>
<h3>Conecte-se</h3>
<p align="justify">Não adianta apenas definir sinais e slots. É preciso definir como eles vão interagir. A maneira de fazer isso é conectando-os através do método <strong>connect()</strong> presente em todo herdeiro de <a href="http://doc.trolltech.com/4.3/qobject.html" class="snap_shots">QObject</a>. Isso fará o moc implementar o sinal de forma que uma chamada a ele resulte numa chamada ao(s) slot(s) conectado(s), com os mesmos parâmetros.</p>
<p align="justify">Dependendo da forma de conexão, um sinal pode até retornar o mesmo valor que o último slot chamado retornar. Note que isso não é muito seguro para sinais conectados a vários slots, pois, nada garante a ordem de chamada.</p>
<p align="justify">Um dado sinal pode ser conectado a um segundo sinal diretamente. Um <strong>emit()</strong> no primeiro sinal é então equivalente a um <strong>emit()</strong> no segundo sinal, visto que após a etapa de criação dos mocs, a chamada ao primeiro resulta na chamada ao segundo, que resulta na chamada de outro método conectado e assim sucessivamente.</p>
<h3>Formas de conexão</h3>
<p align="justify">Existem basicamente <strong>três</strong> formas de conectar sinais e slots e se não usadas adequadamente podem ser fonte de bugs terrivelmente difíceis de se descobrir. Essas formas de conexão são passadas como parâmetros extras para o método <strong>connect()</strong>. São elas:</p>
<p align="justify"><a href="http://doc.trolltech.com/4.3/threads.html#signals-and-slots-across-threads" class="snap_shots">Conexão Direta</a>: O slot é chamado imediatamente ao sinal ter sido emitido, na thread onde o sinal foi emitido. Isso funciona como uma chamada direta ao slot.</p>
<p align="justify"><a href="http://doc.trolltech.com/4.3/threads.html#signals-and-slots-across-threads" class="snap_shots">Conexão Enfileirada</a>: O sinal é emitido e a chamada ao slot vai para uma lista interna do QT, e o sinal retorna imediatamente, independentemente do slot ter sido chamado ou não. O evente loop vai então processando essa lista e só mais tarde o slot será invocado na thread onde o objeto do slot reside.</p>
<p align="justify"><a href="http://doc.trolltech.com/4.3/threads.html#signals-and-slots-across-threads" class="snap_shots">Conexão Automática</a>: Este é o tipo default, utilizado quando não se especifica o tipo de conexão. É uma das <a href="http://www.he-man.org/cartoon/cmotu-pop/universe/evilseed.shtml" class="snap_shots">&#8220;Sementes do Mal&#8221;</a>, pois apresenta dois comportamentos distintos: se o sinal e o slot residirem em uma mesma thread, funciona como conexão direta, mas caso contrário, funciona como conexão enfileirada.</p>
<p align="justify"><a href="http://doc.trolltech.com/4.3/qt.html#ConnectionType-enum" class="snap_shots">Conexão enfileirada Bloqueante</a>: Ué!? não eram só <strong>três</strong>? Well, essa é uma das vantagens de ler esse artigo: te salva de documentação inconsitente! Essa conexão é semelhante à conexão enfileirada, exceto pelo fato de que a thread do sinal fica bloqueada até o sinal ser devidamente executado. Note que só deve se utilizada com muito cuidado, e para sinais e slots em threads diferentes. O mal uso disso poderá causar deadlocks. Você vai saber quando vir algo assim:</p>
<pre>
user@host:~/stopwatch$ ./stopwatch
Qt: Dead lock detected while activating a BlockingQueuedConnection: Sender is
QPushButton(0x807e2d8), receiver is MyDisplay(0x8076ac0)
</pre>
<p align="justify">Para sanar as dúvidas a respeito do que significa a expressão <a href="http://doc.trolltech.com/4.3/threads.html#per-thread-event-loop" class="snap_shots">&#8220;thread onde um objeto reside&#8221;</a> consulte a documentação do QT arespeito de threads.</p>
<p align="justify">Tome sempre muito cuidado com sinais, slots, timers e threads. Esses são recursos fundamentais do QT, mas o seu mal uso pode acarretar em bugs extremamente difíceis de serem localizados. Consulte toda a documentação à respeito.</p>
<h3>Descendo à fonte</h3>
<p align="justify">O nosso exemplo se compões de duas classes MyDisplay e StopWatch e um arquivo main comum. O main apenas cria uma QApplication e um objeto StopWatch. A classe MyDisplay cuida da parte visual do programa, consistindo em um diálogo com botões e um display no estilo LCD. A classe StopWatch vai criar um widget de display e implementar o timer. Note que essa arquitetura não é a mais elegente, sendo mais interessante fazer a classe StopWatch herdar de MyDisplay. Porém, isso estragaria a brincadeira praticamente eliminando a necessidade do uso de sinais e slots.</p>
<p align="justify">O uso de sinais e slots fica mais claro quando queremos que objetos se comuniquem com o seu exterior. Em geral, as classes não conhecem o que há fora delas. Passar ponteiros de objetos externos para dentro delas, fere o encapsulamento e torna o código menos genérico. Em nosso exemplo, o uso mais interessante para sinais e slots é para o objeto myDisplay (interno a StopWatch) comunicar eventos de/para o objeto stopwatch (externo a Mydisplay), sem que para isso se perca em generalidade ou encapsulamento.</p>
<p align="justify">Com a ajuda do QT Designer (num outro artigo eu falarei dele), criei o diálogo, botões e LCD. Depois simplifiquei o código para se adequar aos nossos propósitos. Como myDisplay herda de QDialog e este herda indiretamente de QObject, para usarmos sinais e slots bastou acrescentar a macro Q_OBJECT na seção privada da declaração da classe. Após isso, acrescentei entre outros auxiliares, os métodos:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;"><span style="color: #0057AE;">public</span> <span style="color: #0057AE;">slots</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> slotDisplayValue<span style="color: #006E28;">&#40;</span> <span style="color: #0057AE;">long</span> <span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
&nbsp;
<span style="color: #0057AE;">private</span> <span style="color: #0057AE;">slots</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> slotPlay<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> slotStop<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
&nbsp;
<span style="color: #0057AE;">signals</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> signalPlay<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> signalPause<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> signalStop<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> signalReset<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span></pre></div></div>

<p align="justify">Os sinais comunicarão ao exterior os eventos relacionados aos cliques nos botões. Já os slots privados farão um pré-processamento interno, enquanto o público receberá o valor de ticks vindo do timer externo. Dessa forma a classe envia informações ao exterior e recebe informações de fora, sem conhecer o que está do outro lado. A boa e velha interface por contrato.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp-qt" style="font-family:monospace;"><span style="color: #0057AE;">public</span> <span style="color: #0057AE;">slots</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> slotPlay<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> slotPause<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> slotStop<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
    <span style="color: #0057AE;">void</span> slotReset<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
&nbsp;
<span style="color: #0057AE;">private</span> <span style="color: #0057AE;">slots</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> slotTick<span style="color: #006E28;">&#40;</span><span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span>
&nbsp;
<span style="color: #0057AE;">signals</span><span style="color: #006E28;">:</span>
    <span style="color: #0057AE;">void</span> signalTicks<span style="color: #006E28;">&#40;</span> <span style="color: #0057AE;">long</span> <span style="color: #006E28;">&#41;</span><span style="color: #006E28;">;</span></pre></div></div>

<p align="justify">Análoga e inversamente a classe StopWatch implementa os slots que receberão os sinais da classe MyDisplay, e declara o sinal que enviará informações para o seu slot público.</p>
<p align="justify">Ela também implementa um QTimer que vai disparar a cada 10 milissegundos (para que os nosso amigos lerdinhos do Vista possam acompanhar!), incrementando um contador. Esse contador é enviado de volta ao display que o formata e exibe.</p>
<p align="justify">O cronômetro pode ser parado, pausado e reiniciado a qualquer momento, clicando nos botões correspondentes.</p>
<h3>Os Finalmentes</h3>
<p align="justify">O exemplo em si não tem muito código, mas ilustra o uso mais básico de timers e a construção de sinais e slots customizados. Uma atenção toda especial, no entanto, deve ser dada aos detalhes que envolvem o uso desses recursos, pois eles podem se tornar armadilhas letais.</p>
<h3>Links importantes</h3>
<p><a href="http://doc.trolltech.com/4.3/signalsandslots.html" class="snap_shots">Sinais e Slots</a><br />
<a href="http://doc.trolltech.com/4.3/qtimer.html" class="snap_shots">QTimer</a><br />
<a href="http://doc.trolltech.com/4.3/threads.html" class="snap_shots">Threads no QT</a><br />
<a href="http://doc.trolltech.com" class="snap_shots">Documentação on-line do QT</a></p>
<p class="buymebeer"><form action="https://www.paypal.com/cgi-bin/webscr" target="paypal" method="post"><input type="hidden" name="cmd" value="_xclick" /><input type="hidden" name="business" value="blabos@blabos.org" /><input type="hidden" name="return" value="" /><input type="hidden" name="item_name" value="Buy Me a Beer for Iniciando no QT, parte II - Sinais, Slots e Timers" /><input type="hidden" name="currency_code" value="" /><input type="hidden" name="amount" value="" /><input type="image" src="http://blog.blabos.org/wp-content/plugins/buy-me-beer/icon_beer.gif" align="left" alt="" title="" hspace="3" /></form><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=blabos@blabos.org&amp;currency_code=&amp;amount=&amp;return=&amp;item_name=Buy+Me+a+Beer+for+Iniciando+no+QT,+parte+II+-+Sinais,+Slots+e+Timers" target="paypal">If you liked this post, buy me a beer</a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.blabos.org/2008/02/iniciando-no-qt-parte-ii-sinais-slots-e-timers/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
