Ao aprender C, descobri que os indicadores de aprendizagem eram uma das coisas mais complicadas de se aprender. Vindo de um contexto JavaScript / Ruby, a ideia de um ponteiro sempre foi abstraída. O conceito de ponteiro é muito simples, o que me confundiu foi a sintaxe. No começo, para mim não era tão claro porque a sintaxe realmente não correspondia aos conceitos, até que comecei a escrever um código para entendê-la. Depois de meses brincando com ponteiros em C, tudo fica mais simples. O livro Learn C The Hardway foi bom porque é direto e permite que você escreva código usando ponteiros. Depois de entender os conceitos de um ponteiro e quando começar a escrever código suficiente usando ponteiros, ele clicará e você terá aquele momento familiar “Ah-ha”.
Eu queria passar por alguns dos conceitos sobre ponteiros e então você, leitor, terá que começar a escrever o código.
Referência Direta / Indireta
A primeira coisa a entender é a diferença entre referência direta e indireta e que os ponteiros são referências indiretas.
Dado o cenário, digamos que temos uma sala de aula com 50 carteiras, 10 carteiras de largura e 5 fileiras atrás, atribuímos a cada carteira um número de até 50. Agora todos os alunos entram na sala e se sentam em suas carteiras.
Digamos que haja um aluno chamado Jim e ele tenha a caneta apagadora necessária para iniciar a aula. Quando ligo para Jim em voz alta, ele se levanta e me entrega a caneta. Esta seria uma referência direta. Estou ligando diretamente para Jim, sem me importar onde ele se senta na sala de aula e ele me dá a caneta.
Agora Jim está sentado em uma mesa com o número 36 nele. Se fosse o primeiro dia de aula e eu não soubesse o nome de Jim, se eu dissesse “Mesa número 36, preciso da caneta.” A pessoa chega e me dá a caneta. Eu não precisava saber quem era Jim para conseguir o que precisava para começar a aula. Isso é referência indireta e esse é o conceito de ponteiros com memória.
Você pode pensar na memória como todas as carteiras da sala de aula e os alunos que se sentam em cada carteira são como o que está sendo armazenado na memória. Sempre sabemos o endereço de memória da mesma forma que sabemos o número atribuído a cada carteira na sala de aula.