Show de bola \o
Não sabia que o 2k tinha suporte nativo pra acesso indireto, mesmo limitado a um nível de indireção já dá pra fazer umas coisas bem maneiras!
Só um heads up meio conceitual meio didático: eu acho que não precisava ter falado de ponteiro haha
Ponteiros são acima de tudo uma abstração , e o objetivo de uma abstração é (deveria ser, creio) sempre tornar alguma definição, processo, explicação, etc. mais simples.
A utilidade de um "ponteiro" é, no geral, montar um grafo na memória. Pode parecer meio forçado, porque tem vários usos de ponteiros por aí que não necessariamente parecem grafos, mas você mesmo na hora de mostrar o que são os ponteiros desenhou um haha
O conceito existe porque olhar para a memória exclusivamente de forma sequencial traz algumas dificuldades. Os problemas que ele resolve são, por exemplo: se eu quiser uma lista de números que não cabe em nenhum espaço contíguo na memória, mas se eu somar o espaço livre na memória eu tenho o suficiente para alocar minha lista, como eu faço pra usar espaços separados e ainda assim manter essa lista ligada (pun intended)?
Em programas que fazem alocação dinâmica, isso geralmente é super importante, porque no heap cada coisa vai parar em um lugar, então precisamos de "arestas" entre um "nó" conhecido (um endereço fixo, como a stack ou mesmo um registrador) e o "nó" desejado, que não saberíamos onde está de outra forma. É por esse motivo que costumamos usar ponteiros mesmo onde grafos não aparecem de forma explícita.
Eu entendo que, em C, os ponteiros são números que representam endereços de memória, mas a meu ver definir eles dessa forma é um tanto patológico. Primeiro porque, a princípio, um ponteiro é uma aresta num grafo, e não existe conceito de "incrementar" uma aresta num grafo, como existe em números; além disso, fica fácil demais confundir índices com ponteiros, que acho que é um pouco do que aconteceu aí.
No RPG Maker 2000, não existe nenhuma das complicações que existem em um programa com alocação dinâmica. As variáveis são como endereços fixos de memória, e não faz muito sentido montar um grafo em cima delas (a menos que você queira fazer algo com grafos de fato).
Muito mais simples seria tratá-las como um array, e explicar o acesso indireto em termos de índices, usando o princípio da substituição, que é super intuitivo. Por exemplo, dá pra simplesmente definir:
- Para todo número inteiro x, existe uma variável V[x], que é um número inteiro.
(que é mentira, mas vamos supor que não tem limite nas variáveis e que pode ter índice negativo; inclusive fiquei curioso pra saber como a engine se comporta nesses casos)
Com isso, por definição, como V[x] é um número inteiro, existe uma variável V[V[x]], que é um número inteiro (e por indução, para todo inteiro x e natural n existe uma variável Vⁿ[x], onde Vⁿ identifica a "função" V iterada n vezes; você ganha indireção infinita quase de graça haha)
O que o princípio da substituição diz é que, se eu tenho que V[x] = 5, então V[V[x]] = V[5] (onde = quer dizer "é equivalente a", "pode ser substituido por").
Tá feito: se uma variável é representada por um índice inteiro, e uma variável é um inteiro, então eu posso usar uma variável como índice. Isso é tudo que o "ponteiro" aí faz, mas sem precisar entrar na explicação da abstração e adicionar um conceito a mais sem muita vantagem.
Também faz mais sentido quando você começa a usar isso pra coisas que não são variáveis, como switches ou elementos do banco de dados: não é que a variável representa vários ponteiros pra coisas diferentes, e sim que a variável é um número que, se for substituido ali, faz o que eu quero.
Acho que introduzir ponteiros tem mais vantagem quando se trabalha com memória de fato, e com as complicações envolvidas com alocação dinâmica ou estruturas de dados ligadas (vulgo grafos), mas pra manipulações mais básicas de memória sequencial, provavelmente é melhor ficar na ideia de índice mesmo.
Apesar disso, não tenho o que reclamar da explicação também, com certeza recomendaria pra alguém que estivesse sofrendo em entender ponteiros de fato \o
P.S. Curiosamente, o próprio conceito de "variável" tem muito mais a ver com o princípio da substituição do que com arrays e endereços de memória. De certa forma, eu diria que o 2k é o que melhor trata as variáveis como variáveis de fato, pelo menos nesse aspecto haha