<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lucas Aranha</title>
    <description>The latest articles on DEV Community by Lucas Aranha (@lucasaranha).</description>
    <link>https://dev.to/lucasaranha</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F117043%2F93afcdd3-48a5-4832-8586-27ed351dccaa.jpeg</url>
      <title>DEV Community: Lucas Aranha</title>
      <link>https://dev.to/lucasaranha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucasaranha"/>
    <language>en</language>
    <item>
      <title>Entendendo Ponteiros de uma vez por todas</title>
      <dc:creator>Lucas Aranha</dc:creator>
      <pubDate>Wed, 29 Oct 2025 03:58:36 +0000</pubDate>
      <link>https://dev.to/lucasaranha/entendendo-ponteiros-de-uma-vez-por-todas-3p3e</link>
      <guid>https://dev.to/lucasaranha/entendendo-ponteiros-de-uma-vez-por-todas-3p3e</guid>
      <description>&lt;p&gt;Ponteiros são, sem sobra de dúvidas, um dos mais importantes conceitos da linguagem C. E igualmente importante é entender bem seus conceitos teóricos.&lt;/p&gt;

&lt;p&gt;Afinal, a linguagem tem como uma de suas principais características a manipulação da memória de hardware, sendo utilizada amplamente em sistemas embarcados e aplicações de baixo nível. &lt;/p&gt;

&lt;p&gt;Qual a motivação? Que problemas os ponteiros se encarregam de resolver/mitigar? &lt;/p&gt;

&lt;p&gt;Você pode alterar os valores de uma variável sem ter a necessidade de criar cópias, ou passar esses argumentos na função. &lt;br&gt;
Ao invés disso, é passado um endereço de memória, e a alteração é feita diretamente na variável, sem a necessidade de passagem por cópia. &lt;br&gt;
Em projetos complexos a economia de recursos de hardware é significativa, podendo impactar em premissas do projeto. &lt;/p&gt;

&lt;p&gt;Indo adiante, vamos ilustrar um problema prático para mostrar por que vale a pena dominar os ponteiros:&lt;/p&gt;

&lt;p&gt;Imagine que você é um desenvolvedor e precisa criar um software para modelar as peças e veículos de uma indústria automotiva. Esses arquivos podem ter vários gigabytes e conter inúmeros objetos e camadas.&lt;/p&gt;

&lt;p&gt;Agora pense: se toda vez que um engenheiro fosse acessar ou editar uma peça o sistema precisasse recriar todo o arquivo na memória, ela se esgotaria rapidamente.&lt;/p&gt;

&lt;p&gt;Os ponteiros resolvem esse problema. Em vez de criar uma cópia temporária na RAM, o software apenas passa o endereço de memória da peça que será editada, economizando espaço e tornando o processo muito mais eficiente&lt;/p&gt;

&lt;p&gt;Portanto, aprender ponteiros é talvez o maior desafio da jornada e irá preparar o jovem bolseiro pros desafios que virão com as Estruturas de Dados. &lt;/p&gt;

&lt;p&gt;Quando criar um ponteiro? Como passar como referência? Como &lt;em&gt;des(referenciar)&lt;/em&gt; e acessar o conteúdo para onde ele aponta? Como manipular os endereços de memória? &lt;/p&gt;

&lt;p&gt;Pensando dessa forma, resolvi escrever um pouco pois é uma boa forma de "dumpar" o conteúdo visto e também me força a tentar ensinar ou reforçar conceitos à você que está lendo. Espero que consiga ajudar a você, e ao Lucas do futuro, nessa jornada! &lt;/p&gt;

&lt;p&gt;Ponteiros, basicamente, são tipos de variáveis que armazenam endereços de outras variáveis. A sua declaração é simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int *ptr; //declarando um ponteiro para o tipo inteiro, ou seja, serão reservados 4 bytes de memória.

int valor = 20;
ptr = &amp;amp;valor;

printf("%d", *ptr);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que aconteceu nesse trecho de código, foi: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwa0dqnb5pj1qy30pccb8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwa0dqnb5pj1qy30pccb8.png" alt="analise-codigo-ponteiros" width="709" height="638"&gt;&lt;/a&gt;&lt;br&gt;
Ou seja, repare que um ponteiro &lt;em&gt;recebe apenas endereços de memória&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O acesso ao conteúdo propriamente dito do endereço armazenado é feito através do &lt;em&gt;desreferenciamento&lt;/em&gt; do ponteiro, denotado por "*". &lt;/p&gt;

&lt;p&gt;ptr = &amp;amp;[aqui vai um endereço de memória de uma variável]&lt;br&gt;
*ptr = [aqui será alterado o conteúdo dentro da variável apontada].&lt;/p&gt;

&lt;p&gt;Ficou claro? (se não, comenta aí!)&lt;/p&gt;

&lt;p&gt;E o que acontece, se eu fizer uma alteração no valor da variável apontada? &lt;/p&gt;

&lt;p&gt;Simples: o valor será alterado dentro da variável. Afinal, se eu sou um "ponteiro" e sei o endereço de uma variável, posso ler ou alterar seu conteúdo. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcr9nswxnz3lhb9905qf8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcr9nswxnz3lhb9905qf8.png" alt="analise-codigo-ponteiros-02" width="714" height="751"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ponteiros são extremamente poderosos. Essa foi uma rápida introdução ao assunto, vou deixar aqui abaixo alguns links de referência caso seja do seu interesse, ou do seu professor, que você aprenda. =] &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=2ybLD6_2gKM&amp;amp;pp=ygUIcG9pbnRlcnM%3D" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=2ybLD6_2gKM&amp;amp;pp=ygUIcG9pbnRlcnM%3D&lt;/a&gt;&lt;/p&gt;

</description>
      <category>c</category>
      <category>ponteiros</category>
      <category>referencia</category>
      <category>desreferencia</category>
    </item>
    <item>
      <title>Manipulações em Estruturas Homogêneas - Vetores.</title>
      <dc:creator>Lucas Aranha</dc:creator>
      <pubDate>Mon, 20 Apr 2020 07:38:52 +0000</pubDate>
      <link>https://dev.to/lucasaranha/manipulacoes-em-estruturas-homogeneas-vetores-1bea</link>
      <guid>https://dev.to/lucasaranha/manipulacoes-em-estruturas-homogeneas-vetores-1bea</guid>
      <description>&lt;p&gt;Vetores são grandes aliados quando o assunto é armazenamento e tratamento de dados homogêneos. Há varias formas de preencher, armazenar, percorrer e organizar seu conteúdo. &lt;/p&gt;

&lt;p&gt;Veremos a seguir uma forma de extrair informações de vetores.&lt;/p&gt;

&lt;p&gt;Como poderíamos após termos lido dois vetores, obter um terceiro vetor com a intersecção deles? &lt;br&gt;
Exemplo: Dado um vetor A[5] = {7, 2, 4, 6, 8} e um outro vetor B[3] = {8, 12, 2}. Obtermos como saída o vetor C[2] = {2, 8}. &lt;/p&gt;

&lt;p&gt;É simples. Você pode simplesmente escolher um dos vetores e utiliza-lo para comparar com os elementos do outro. E não, não importa qual é o maior, o número de comparações será o mesmo. &lt;br&gt;
A grande sacada do exercício estará dentro do seu laço de comparação. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--spYuZXPm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dmdwk37647xm0ve59ca6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--spYuZXPm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/dmdwk37647xm0ve59ca6.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma parte do seu programa deve se preocupar em realizar a comparação de um elemento do vetor, com todos os elementos do outro, dessa forma:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d7wVEoal--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/83hpz51ctkv7wzx15yhf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d7wVEoal--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/83hpz51ctkv7wzx15yhf.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dito isso, devemos observar alguns parâmetros que estarão inseridos no código, mais precisamente, na variável que ficará responsável por essas comparações. &lt;br&gt;
Uma possibilidade é, quando estiver lendo ambos vetores, criar variáveis que guardem o seu tamanho e que posteriormente no seu código, sirvam de “pontos de parada”.&lt;br&gt;&lt;br&gt;
Pense da seguinte forma, cada i do vetor A fará N comparações antes de seguir ao elemento seguinte. &lt;br&gt;
No nosso exemplo, o A[i] será comparado com B[i] até B[i-1], ou seja, percorrerá todo o vetor. A repetição só deve ser encerrada quando o primeiro índice de um vetor for comparado com todos do outro a fim de encontrar uma igualdade. &lt;br&gt;
Se essa condição for satisfeita, então o vetor é incrementado com o conteúdo. &lt;/p&gt;

&lt;p&gt;No final dessas comparações, o vetor C terá os elementos {2, 8}, como na imagem a seguir:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YlnoTj2b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pfhfxbm06g7lk3z921uo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YlnoTj2b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/pfhfxbm06g7lk3z921uo.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E assim chegamos ao resultado esperado! Espero ter ajudado você, até mais!&lt;/p&gt;

</description>
      <category>vetor</category>
      <category>iniciante</category>
      <category>c</category>
      <category>algoritmos</category>
    </item>
    <item>
      <title>Busca binária em Vetor</title>
      <dc:creator>Lucas Aranha</dc:creator>
      <pubDate>Mon, 16 Dec 2019 07:49:58 +0000</pubDate>
      <link>https://dev.to/lucasaranha/busca-binaria-em-vetor-3bdd</link>
      <guid>https://dev.to/lucasaranha/busca-binaria-em-vetor-3bdd</guid>
      <description>&lt;p&gt;Olá pessoas!&lt;/p&gt;

&lt;p&gt;Tentarei publicar algumas anotações e aprendizados à respeito de Estruturas de Dados para, além de fixar melhor o conteúdo, poder contribuir com uma visão mais abstrata da lógica, facilitando a implementação do código.&lt;/p&gt;

&lt;p&gt;A primeira postagem é sobre a &lt;strong&gt;Busca Binária&lt;/strong&gt;: &lt;/p&gt;

&lt;p&gt;Vamos supor que, dado um vetor &lt;em&gt;ordenado&lt;/em&gt; de tamanho qualquer, você queira encontrar um determinado número que possa estar dentro dessa estrutura. &lt;/p&gt;

&lt;p&gt;No exemplo a seguir iremos utilizar um vetor com 10 posições, ou seja, seu índice vai de 0 à 9.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YKul24fB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/02fcG3V.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YKul24fB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/02fcG3V.png" alt="Alt Text" width="841" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A busca binária consiste na ideia de "quebrar o código ao meio" e checar se o elemento está a esquerda ou a direita, quebrando o vetor em metades, se assim podemos dizer. &lt;/p&gt;

&lt;p&gt;Como sabemos que esse vetor é ordenado, podemos pensar da seguinte forma:  &lt;em&gt;se&lt;/em&gt; o valor encontrado no vetor for maior que o elemento que estamos procurando, o "indicador" deve andar para a direita, &lt;em&gt;caso contrário&lt;/em&gt;, ele irá para a esquerda. &lt;/p&gt;

&lt;p&gt;Você pode definir duas variáveis: &lt;em&gt;"início"&lt;/em&gt; e &lt;em&gt;"final"&lt;/em&gt;, onde a primeira começa em 0 e a segunda, em n-1, sendo n o tamanho do vetor. Outra variável deve ser criada, ela será responsável por "direcionar" a procura do elemento no vetor. Chamaremos-a de &lt;em&gt;"meio"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O índice receberá o resultado da aritmética: (0 + 9)/2, seguindo nosso exemplo. Portanto, como é inteiro, a variável "meio" terá valor 4. &lt;/p&gt;

&lt;p&gt;Partiremos de Vet[meio] para checar seu conteúdo e definir pra onde iremos. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7Quv7iYH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6rvysfv8skozg9qth101.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7Quv7iYH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6rvysfv8skozg9qth101.png" alt="Alt Text" width="690" height="121"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;O elemento que queremos encontrar é maior ou menor que Vet[meio]?&lt;/em&gt;&lt;br&gt;
Se for maior, todos os números menores que Vet[meio] e até o próprio, serão descartados da busca. Portanto, precisamos somente atualizar a variável início para seu novo valor. &lt;/p&gt;

&lt;p&gt;O algoritmo consiste em trabalhar dessa forma até encontrar o valor&lt;br&gt;
desejado. &lt;br&gt;
A próxima iteração trará o início com seu novo valor e o meio ancorado na metade do que sobrou do vetor. Veja:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qjkei6-R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/apfir1nqvmxyxg8q1m5f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qjkei6-R--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/apfir1nqvmxyxg8q1m5f.png" alt="Alt Text" width="684" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Novamente, perceba que desta vez o elemento é &lt;em&gt;maior&lt;/em&gt; que o conteúdo do índice do vetor, manipularemos a variável início para que descarte o valor inferior:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eSdgQitR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/q9h5en2cu3v6z3t8aqud.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eSdgQitR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/q9h5en2cu3v6z3t8aqud.png" alt="Alt Text" width="680" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E por fim, o algoritmo retorna a posição onde está alocado o elemento procurado:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hM54EPPY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/o1bdperu9g2yf9ttliys.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hM54EPPY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/o1bdperu9g2yf9ttliys.png" alt="Alt Text" width="676" height="88"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A vantagem é simples: pense em um vetor de 1000 posições. Uma busca linear, em seu pior caso, teria 1000 iterações; Já a busca binária, somente 10. (considerando que o valor estará no vetor). &lt;/p&gt;

&lt;p&gt;Referências bibliográficas:&lt;/p&gt;

&lt;p&gt;BACKES, André. &lt;strong&gt;Estruturas de Dados Descomplicada - Em Linguagem C&lt;/strong&gt;. Rio de Janeiro: Elsevier, 2016.&lt;/p&gt;

</description>
      <category>busca</category>
      <category>binaria</category>
      <category>vetor</category>
      <category>c</category>
    </item>
  </channel>
</rss>
