Uma introdução aos ponteiros para programadores

Se você perceber, ou não, a grande maioria dos programas você usou make uso de ponteiros de alguma forma. Talvez você tenha experimentado um Null Pointer Exception

em algum ponto. Como um programador, código que você escreve será mais do que os ponteiros de uso prováveis, mesmo se você não implementado-los sozinho.

Hoje eu vou lhe mostrar como ponteiros trabalhar, então você pode querer verificar para fora como matrizes e listas de trabalho para uma primeira demão de programação. Este artigo será mais teoria baseada do que o habitual, mas ficar com ela, os ponteiros são muito complexas!Como matrizes e listas de trabalho em PythonComo matrizes e listas de trabalho em PythonMatrizes e listas são algumas das estruturas de dados mais úteis na programação - embora poucas pessoas usá-los para o seu pleno potencial.consulte Mais informação

Código compilação

Antes de escavar em ponteiros, você precisa entender como o código é construído e executado - talvez você já sabe disso. Esta seção terá declarações bastante gerais - coisas que se aplicam ao maioria de línguas, mas não necessariamente todos eles.

ponteiros

Vamos levar as coisas de volta ao começo. cada computador usa binário, uma série de zeros e uns que compõem a tecnologia moderna como a conhecemos. É extremamente difícil para codificar qualquer coisa em binário (os arquivos seria muito confuso), pois estas são as instruções matérias necessários para o seu unidade central de processamento ou CPU para funcionar. Isto é conhecido como Código da máquina.O que é o binário? [Tecnologia Explicada]O que é o binário? [Tecnologia Explicada]Dado que binário é tão absolutamente fundamental para a existência de computadores, parece estranho que nós nunca abordou o assunto antes - por isso hoje eu pensei que eu iria dar um breve resumo do que binário ...consulte Mais informação

O próximo passo do código máquina é Montagem. Este é um formato legível tanto humana. Enquanto ele ainda é complexo para programar, é possível. Assembléia é composta de uma série de comandos simples para executar tarefas, e é conhecido como um nível baixo linguagem de programação. É possível escrever programas complexos, mas é difícil de expressar conceitos abstratos, e requer muita consideração.

Muitos jogos de vídeo e aplicações de alto desempenho têm alguma da lógica escrito em assembly, como alguns real velocidade aumentos podem ser encontrados se você sabe o que está fazendo. No entanto, para a grande maioria dos projetos de programação, você não precisa saber qualquer montagem em tudo.

ponteiros

Então, se o código de máquina é muito difícil de escrever, ea montagem é muito difícil de programa, o que você escrever código com? Aqui é onde alto nível línguas entrar. linguagens de alto nível fazer programas fáceis de escrever. Você pode programar em algo que se assemelha a sua língua nativa, e é fácil de expressar algoritmos complexos. Você pode ter ouvido de muitas linguagens de alto nível (e você vai definitivamente ter usado um programa escrito neles):

  • BASIC
  • C ++
  • cicio

Essas línguas são muito velho agora, e muitos foram desenvolvidos no início de 1950! Quase toda linguagem de programação moderna é uma linguagem de alto nível, incluindo PHP e Python. Há mais idiomas que estão sendo inventados todos os dias (embora haja provavelmente o suficiente agora), mas como é que o seu código ainda funcionar corretamente se os computadores exigem código de máquina?

Aqui é onde compilação entra. Um compilador é um programa que converte seu código de alto nível em um formulário que pode ser executado. Esta poderia ser uma outra linguagem de alto nível, mas normalmente é montagem. Algumas linguagens (como Python ou Java) converter o seu código em um estágio intermediário chamado bytecode. Isto terá de compilar novamente em uma data posterior, o que geralmente é feito sob demanda, tais como quando o programa é executado. Isto é conhecido como na hora certa compilação, e é bastante popular.

Gerenciamento de memória

Agora que você sabe como as linguagens de programação funciona, vamos olhar para o gerenciamento de memória em linguagens de alto nível. Para estes exemplos, eu vou estar usando o código pseudo - código não escrito em qualquer idioma específico, mas usado para mostrar conceitos ao invés de sintaxe exata. Hoje, esta será principalmente se assemelham C ++ como essa é a melhor linguagem de alto nível (na minha opinião).

Para esta seção, ele vai ajudar se você tiver uma compreensão de como RAM funciona.Um rápido & Guia sujo para RAM: O Que Você Precisa SaberUm rápido & Guia sujo para RAM: O Que Você Precisa SaberRAM é um componente crucial de todos os computadores, mas pode ser confuso para entender se você não é um guru da tecnologia. Neste post, vamos dividi-la em termos de fácil compreensão.consulte Mais informação

A maioria das línguas têm variáveis ​​- recipientes que armazenam alguns dados. Você tem que definir explicitamente o tipo de dados. Algumas linguagens digitadas dinamicamente, como Python ou PHP lidar com isso para você, mas eles ainda têm de fazê-lo.

Video: Programar em C - Introdução Ponteiros(Teoria) - Aula 60

Digamos que você tenha uma variável:

int myNumber-

Esse código declara uma variável chamada meu numero, e dá-lhe um tipo de dados de número inteiro. Uma vez compilado, o computador interpreta este comando como:

“Encontrar alguma memória vazio, e reservar um espaço grande o suficiente para armazenar um inteiro”

Uma vez que este comando foi executado, aquele pedaço de memória não pode ser utilizado por outro programa. Ele não contém quaisquer dados ainda, mas é reservado para sua variável myNumber.

Video: Programar em C - Introdução Ponteiros(Prática) - Aula 61

Agora atribuir um valor para a variável:

meu numero = 10-

Para concluir esta tarefa, o computador acessa a localização de memória reservada, e as mudanças qualquer valor é armazenado lá, para este novo valor.

Agora, isso é tudo muito bem, mas como locais de memória ficar sem reservas? Se os programas reservados toda a memória que eles gostam, a RAM iria encher-se de imediato - que faria para um muito sistema lento.

ponteiros

Para evitar esse problema em potencial, muitas línguas implementar um coletor de lixo, usado para destruir variáveis ​​(e, portanto, liberar os locais de memória reservados) que têm ido fora do escopo.

Você pode estar se perguntando o escopo e é por isso que é tão importante. Escopo define os limites e tempo de vida de variáveis ​​ou qualquer memória usada por um programa. Uma variável é “fora do escopo” quando já não pode ser acessado por qualquer código (que é quando os passos coletor de lixo em). Aqui está um exemplo:

função Matemáticas() {int firstNumber = 1-}int secondNumber = 2-impressão(firstNumber + secondNumber)- // não funciona


Este exemplo não será compilado. a variável firstNumber está dentro do Matemáticas função, de modo que é a sua abrangência. Ele não pode ser acessado de fora da função na qual ela foi declarada. Este é um conceito de programação importante, e entendê-la é crucial para trabalhar com ponteiros.

Esta forma de tratamento de memória é chamado de pilha. É a maneira que a grande maioria dos programas de trabalho. Você não tem que entender ponteiros para usá-lo, e ele está muito bem estruturado. A desvantagem da pilha é a velocidade. À medida que o computador tem de atribuir memória, manter o controle de variáveis, e executar a coleta de lixo, há uma pequena sobrecarga. Isso é bom para programas menores, mas que sobre as tarefas de alto desempenho, ou dados de aplicações pesadas?

Enter: ponteiros.

ponteiros

Na superfície, os ponteiros parecer simples. Eles referência (aponta para) De uma localização na memória. Isso pode não parecer qualquer diferentes para as variáveis ​​“regular” na pilha, mas confia em mim, há uma enorme diferença. Os ponteiros são armazenados no montão. Este é o oposto da pilha - é menos organizado, mas é muito mais rápido.

Vejamos como as variáveis ​​são atribuídos na pilha:

int numberone = 1-int NUMBERTWO = número um-

Isto é simples syntax- A variável número dois contém o número um. Seu valor é copiado em todo durante a atribuição do número um variável.

Se você queria para obter o endereço de memória de uma variável, em vez de seu valor, você tem que usar o sinal e comercial (&). Isso é chamado de endereço operador, e é uma parte essencial do seu kit de ferramentas ponteiro.

int numberone = 1-int NUMBERTWO = &número um-

Agora o número dois variável pontos para um local de memória, em vez de obter o número um copiado através de si própria, novo local de memória. Se você fosse para a saída esta variável, não seria o número um (apesar de que é armazenada na posição de memória). Seria saída é local de memória (provavelmente algo como 2167, embora varie dependendo do sistema e RAM disponível). Para acessar o valor armazenado em um ponteiro, em vez do local de memória, você tem que dereference o ponteiro. Este acessa o valor diretamente, o que seria o número um neste caso. Veja como você dereference um ponteiro:

Video: Talk #31 - Desmistificando pointers em C (ponteiros)

int NUMBERTWO = *número um-

o operador dereference é um asterisco (*).

Este pode ser um conceito difícil de entender, então vamos passar por isso novamente:

  • o endereço operador (&) Armazena o endereço de memória.
  • o operador dereference (*) Acede ao valor.

As mudanças da sintaxe ligeiramente ao declarar ponteiros:

int * myPointer-

O tipo de dados int aqui refere-se ao tipo de dados do ponteiro pontos para, e não o tipo do ponteiro em si.

Agora que você sabe o que os ponteiros são, você pode fazer alguns truques realmente puros com eles! Quando a memória é usado, o sistema operacional começa sequencialmente. Você pode pensar em RAM como escaninhos. Muitos buracos para guardar alguma coisa, apenas um pode ser usado ao mesmo tempo. A diferença aqui é que esses escaninhos estão todos contados. Ao atribuir memória, o sistema operacional começa no menor número, e trabalha-se. Isso nunca vai pular entre números aleatórios.

ponteiros

Ao trabalhar com ponteiros, se tiver atribuído uma matriz, você pode facilmente navegar para o próximo elemento por simples incrementando o ponteiro.

Aqui é onde fica interessante. Quando você passar valores para uma função (usando variáveis ​​armazenadas na pilha), estes valores são copiados para a sua função. Se estes são grandes variáveis, você programa está agora armazená-los duas vezes. Quando sua função é terminado, você pode precisar de uma maneira de retornar esses valores. As funções podem geralmente retornar apenas uma coisa - então o que se queria voltar dois, três ou quatro coisas?

ponteiros

Se você passar um ponteiro para a sua função, apenas o endereço de memória é copiado (que é pequena). Isso economiza seu CPU muito trabalho! Talvez o ponteiro aponta para uma matriz de imagem enorme - não só o seu trabalho função nos mesmos dados armazenados no mesmo exato local de memória, mas uma vez que é feito, não há necessidade de retornar nada. Puro!

Você tem que ter muito cuidado embora. Ponteiros ainda pode ir fora do escopo e ser recolhida pelo coletor de lixo. Os valores armazenados na memória, no entanto, não se recolheu. Isso é chamado de um vazamento de memória. Você não pode mais acessar os dados (como os ponteiros foram destruídas), mas ainda está usando a memória. Esta é uma razão comum para muitos programas para falhar, e pode falhar espetacularmente se houver uma grande quantidade de dados. Na maioria das vezes, o sistema operacional vai matar o seu programa se você tem um grande vazamento (usando mais memória RAM do que o sistema tem), mas isso não é desejável.

ponteiros

ponteiros de depuração pode ser um pesadelo, especialmente se você estiver trabalhando com grandes quantidades de dados, ou trabalhando em loops. Suas desvantagens e dificuldades para entender realmente valem os trade-offs que você ganha em performance. Embora lembre-se, eles podem nem sempre ser necessária.

É isso por hoje. Espero que você tenha aprendido alguma coisa útil sobre um tema complexo. tudo é claro, nós não cobrimos que há para saber - é um tema muito complexo. Se você estiver interessado em aprender mais, eu recomendo C ++ em 24 Horas.

Se este era um pouco complexo, dê uma olhada o nosso guia para os mais fáceis linguagens de programação.6 línguas mais fácil de programação de aprender para Iniciantes6 línguas mais fácil de programação de aprender para IniciantesAprender a programar é sobre encontrar a linguagem certa, tanto quanto é sobre o processo de edificação. Aqui estão as seis principais linguagens de programação mais fáceis para iniciantes.consulte Mais informação

Você aprendeu como ponteiros trabalho hoje? Tem algumas dicas e truques que você deseja compartilhar com outros programadores? Ir para os comentários e partilhar os seus pensamentos abaixo!


Artigos relacionados