Ponteiro
Uma variável ou expressão ponteiro é uma referência a outra variável (incluindo matrizes e elementos de matriz), tabela, campo, ou objecto. Não há campo do tipo Pointer.
Os apontadores fornecem uma forma avançada (na programação) para se referir aos dados. Quando você usar a linguagem, você acessa vários objetos - em particular, tabelas, campos, variáveis, objetos e matrizes - simplesmente usando seus nomes. No entanto, muitas vezes é útil fazer referência a estes elementos e aceder aos mesmos sem conhecer os seus nomes. Isto é o que os indicadores lhe permitem fazer.
O conceito subjacente aos ponteiros não é assim tão incomum na vida cotidiana. Muitas vezes você se refere a algo sem saber sua identidade exata. Por exemplo, poderia dizer a um amigo: "Vamos dar uma volta no seu carro" em vez de "Vamos dar uma volta no carro com a placa 123ABD". Neste caso, está a referenciar o carro com a matrícula 123ABD, utilizando a frase "o seu carro". A frase "carro com matrícula 123ABD" é como o nome de um objecto, e utilizar a frase "o seu carro" é como utilizar um ponteiro para fazer referência ao objecto.
Ser capaz de se referir a algo sem conhecer a sua identidade exata é muito útil. De facto, o seu amigo poderia obter um carro novo, e a frase "o seu carro" continuaria a ser exata - continuaria a ser um carro e ainda poderia dar uma volta nele. Os ponteiros funcionam da mesma maneira. Por exemplo, um ponteiro poderia, de uma vez, referir-se a um campo numérico chamado Age, e mais tarde referir-se a uma variável numérica chamada Old Age. Em ambos os casos, o ponteiro faz referência a dados numéricos que poderiam ser utilizados num cálculo.
Pode usar apontadores para referenciar tabelas, campos, variáveis, matrizes, elementos de array, e objetos. A tabela a seguir dá um exemplo de cada tipo de dado:
Tipo | Referenciação | Para usar | Atribuição |
---|---|---|---|
Tabela | vpTable:=->[Table] | DEFAULT TABLE(vpTable->) | n/a |
Campo | vpField:=->[Table]Field | ALERT(vpField->) | vpField->:="John" |
Variável | vpVar:=->Variable | ALERT(vpVar->) | vpVar->:="John" |
Array | vpArr:=->Array | SORT ARRAY(vpArr->;>) | COPY ARRAY (Arr;vpArr->) |
Elemento Array | vpElem:=->Array{1} | ALERT (vpElem->) | vpElem->:="John" |
Object | vpObj:=->myObject | ALERT (vpObj->myProp) | vpObj->myProp:="John" |
Usando um ponteiro: Exemplo básico
É mais fácil explicar o uso de ponteiros através de um exemplo. Este exemplo mostra como acessar uma variável através de um ponteiro. Começamos por criar uma variável:
$MyVar:="Hello"
$MyVar é agora uma variável que contém a string "Olá". Agora podemos criar um ponteiro para $MyVar:
C_POINTER($MyPointer)
$MyPointer:=->$MyVar
O símbolo -> significa "fazer um ponteiro para". Este símbolo é formado por um traço seguido por um sinal "maior que". Neste caso, ele recebe o ponteiro que faz referência ou "aponta para" $MyVar. Este ponteiro é atribuído ao MyPointer com o operador de atribuição.
$MyPointer é agora uma variável que contém um ponteiro para $MyVar. $MyPointer não contém "Olá", que é o valor em $MyVar, mas pode usar $MyPointer para obter este valor. A seguinte expressão devolve o valor em $MyVar:
$MyPointer->
Nesse caso, ela retorna a seqüência de caracteres "Olá". O símbolo -> , quando segue um ponteiro, faz referência ao objecto apontado. A isto chama-se desreferenciação.
É importante compreender que pode utilizar um ponteiro seguido do símbolo -> em qualquer lugar para o qual pudesse ter utilizado o objecto para o qual o ponteiro aponta. Isto significa que poderia usar a expressão $MyPointer-> em qualquer lugar onde pudesse usar a variável original $MyVar . Por exemplo, a linha seguinte exibe uma caixa de alerta com a palavra Olá nela:
ALERT($MyPointer->)
Pode também utilizar $MyPointer para alterar os dados em $MyVar. Por exemplo, a seguinte declaração armazena a string "Goodbye" na variável $MyVar:
$MyPointer->:="Goodbye"
Se examinar as duas utilizações da expressão $MyPointer->, verá que ela actua como se tivesse utilizado $MyVar em seu lugar. Em resumo, as duas linhas seguintes realizam a mesma ação - ambas apresentam uma caixa de alerta contendo o valor actual na variável $MyVar:
ALERT($MyPointer->)
ALERT($MyVar)
As duas linhas seguintes executam a mesma ação - ambas atribuem a string "Goodbye" a $MyVar:
$MyPointer->:="Goodbye"
$MyVar:="Goodbye"
Operadores de Ponteiros
Con:
vPtrA e vPtrB apontam para o mesmo objecto
vPtrA:=->anObject
vPtrB:=->anObject
` vPtrC aponta para outro objecto
vPtrC:=->outroObject