BlitzMax/Lições/Ponteiro

Ponteiros são os chamados tipos de dados abstratos, eles não armazenam valores como variáveis concetas como ints, floats ou strings, armazenam apenas o endereço destas variáveis.

Para entender melhor imagine uma memória RAM, nela tem vários slots onde são armazenados dados, cada slot dessa memória RAM tem um endereço específico, quando você cria uma variável você reserva um endereço na memória RAM, se essa variável for concreta (int, float, string), o conteúdo do slot será o valor que você entrou, já se essa variável for abstrata (ponteiro), o conteúdo será o endereço de alguma outra variável na memória.

Portando partindo desse conceito que um ponteiro armazena apenas o endereço de memória de outras variáveis é a mesma coisa de dizer que ele "aponta" outras variáveis.

Mexer com ponteiros exige um cuidado especial, isso porque mexer no conteúdo de uma variável apontada não irá mexer no conteúdo do ponteiro. Por exemplo, imagine a seguinte situação:

  1. Você cria uma variável concreta (int, float ou string)
  2. Você cria uma variável abstrata (ponteiro)
  3. Você armazena dentro do variável abstrata (ponteiro) o endereço da variável concreta (int, float ou string)
  4. Você deleta a variável concreta (int, float ou string)

Nesse caso vemos que depois que deletamos a nossa variável concreta, o ponteiro continua apontando para o antigo endereço dela, isso causará um erro no programa já que o ponteiro não pode apontar para endereços vazios.

Criando um ponteiro

editar

No BlitzMax não existe forma simplificada de criar um ponteiro como nas variáveis concretas, primeiro deve-se definir a localização da variável (local ou global) depois escreve-se o nome da variável, depois o tipo concreto da variável e por último utiliza-se o comando Ptr

Local ponteiroInt% Ptr
Local ponteiroFloat# Ptr
Local ponteiroString$ Ptr

Para se usar dentro de um Type, cria-se o ponteiro após o Field.

Type TMeuTipo
    Field ponteiroInt% Ptr
    Field ponteiroFloat# Ptr
    Field ponteiroString$ Ptr
EndType

Apontando para uma variável

editar

Vamos agora mexer com ponteiros na prática, primeiro criaremos uma variavel int e atribuiremos a ela um valor.

meuInteiro% = 10

Agora vamos criar um ponteiro.

meuInteiro% = 10
Local ponteiroInt% Ptr

Agora para pegar o conteúdo da variável meuInteiro vamos usar o comando Varptr.

meuInteiro% = 10
Local ponteiroInt% Ptr
ponteiroInt% = Varptr meuInteiro%

Agora para exibir na tela iremos usar o primeiro campo do ponteiro.

meuInteiro% = 10
Local ponteiroInt% Ptr
ponteiroInt = Varptr meuInteiro%
Print "Conteudo de ponteiroInt" + ponteiroInt[0]

Passando um ponteiro como parâmetro de função

editar

Você pode passar um ponteiro como parâmetro para modificar uma variavel pelo seu endereço.

Function minhaFuncao(ponteiro% Ptr)
    ponteiro[0] = 1
EndFunction

inteiro% = 0
Print inteiro%
minhaFuncao(inteiro%)
Print inteiro%