Símbolos @ e ^
Olá,
Me desculpem se a dúvida é meio idiota, mas eu gostaria que alguem me explicasse de uma forma clara e objetiva pra que servem esses dois símbolos (@ e ^).
Muito Grato,
Té mais
Me desculpem se a dúvida é meio idiota, mas eu gostaria que alguem me explicasse de uma forma clara e objetiva pra que servem esses dois símbolos (@ e ^).
Muito Grato,
Té mais
Wart
Curtidas 0
Respostas
Beppe
23/02/2005
Pra que fazer as coisas claras e objetivas quando se pode fazê-las turvas e complicadas?
Brincadeira, vou tentar explicar.
Existe endereço e conteúdo. Algo como o número 1 ou o caractere ´A´ é dito conteúdo, não tem como acessá-los* diretamente, precisamos de um endereço. Uma variável, por exemplo, tem um endereço, e neste endereço estará o valor que a variável representa.
O operador prefixo @ pega o endereço de uma expressão, mas nem todas as expressões tem endereço. O operador sufixo ^ é dito dereferenciar, ou melhor, o uso dele. Este operador faz o inverso, dado um endereço, recupera seu conteúdo.
Isto é válido:
@UmaVariavel // retorna um ponteiro para a variável, e não seu conteúdo
@UmaFuncao
(@UmaString[1])^
PChar(UmaString)^
UmaVariavelDoTipoPonteiro^
Isto NÃO é válido:
@1
@´a´
UmaVariavelNãoPonteiro^
UmaFuncao^
Existem casos especiais, como expressões como argumentos var, dereferenciamento automático, etc...mas isso é outra história.
* não tem MESMO
Brincadeira, vou tentar explicar.
Existe endereço e conteúdo. Algo como o número 1 ou o caractere ´A´ é dito conteúdo, não tem como acessá-los* diretamente, precisamos de um endereço. Uma variável, por exemplo, tem um endereço, e neste endereço estará o valor que a variável representa.
O operador prefixo @ pega o endereço de uma expressão, mas nem todas as expressões tem endereço. O operador sufixo ^ é dito dereferenciar, ou melhor, o uso dele. Este operador faz o inverso, dado um endereço, recupera seu conteúdo.
Isto é válido:
@UmaVariavel // retorna um ponteiro para a variável, e não seu conteúdo
@UmaFuncao
(@UmaString[1])^
PChar(UmaString)^
UmaVariavelDoTipoPonteiro^
Isto NÃO é válido:
@1
@´a´
UmaVariavelNãoPonteiro^
UmaFuncao^
Existem casos especiais, como expressões como argumentos var, dereferenciamento automático, etc...mas isso é outra história.
* não tem MESMO
GOSTEI 0
Wart
23/02/2005
mmm, melhorou um pouco, mas.. (sempre tem um mas, hehehe...)
blz, mais três perguntas: o que (mas o q mesmo.. num consigo nem imagina o q seja isso) seria esse endereço que é retornado?
Tem como o amigo [b:5f3dfa96d4]Beppe[/b:5f3dfa96d4] ou outra alma caridosa me dar uns 2 exemplos práticos de uso desses bixinhos??
porque quando uso @ ele me fala q é inseguro?
hehe, brigadão pela atenção...
té mais
blz, mais três perguntas: o que (mas o q mesmo.. num consigo nem imagina o q seja isso) seria esse endereço que é retornado?
Tem como o amigo [b:5f3dfa96d4]Beppe[/b:5f3dfa96d4] ou outra alma caridosa me dar uns 2 exemplos práticos de uso desses bixinhos??
porque quando uso @ ele me fala q é inseguro?
hehe, brigadão pela atenção...
té mais
GOSTEI 0
Beppe
23/02/2005
var A: array[0..100] of Char; P: PChar; // PChar é ponteiro para Char begin P := @A[0]; // pega ponteiro para o primeiro elemento no array P^ := ´O´; // mesmo que A[0] := ´O´ P := P + 1; // avança para o próximo caractere no array P^ := ´i´; // mesmo que A[1] := ´i´ P := P + 1; // avança para o próximo caractere no array P^ := 0; // mesmo que A[2] := 0; isto termina a string Caption := A; end;
Mexer com ponteiros é sempre ´inseguro´...a partir do Delphi 7, o compilador exibe estas mensagens por compatibilidade com o .NET...dá pra desabilitar no IDE também...
GOSTEI 0
Tnaires
23/02/2005
Mexer com ponteiros é sempre ´inseguro´...
É o tipo da coisa... só mexa com ponteiros se vc souber BEM o q vc quer fazer... Em geral, ponteiros é uma coisa q a gente só aprende na faculdade ou estudando sozinho. Hmmm... alguém já encontrou necessidade d usar ponteiros desenvolvendo algum sistema comercial em Delphi?
GOSTEI 0
Kapak
23/02/2005
Talvez o colega Beppe esqueceu de mencionar que o operador ^ também é utilizado como ponteiro:
Neste caso, ^TData_PTR é um ponteiro p/ o record TData.
Existem muitos usos de ponteiro em aplicações, um típico exemplo é quando vc deseja passar alguma variável de uma dll p/ o seu .exe; vc pode fazer isso utilizando SendMessage e passar o ponteiro dessa variável através do wparam.
O * é utilizado em C/C++ como ponteiro.
type TData_PTR = ^TData; TData = record Dia,Mes,Ano:Word; end;
Neste caso, ^TData_PTR é um ponteiro p/ o record TData.
Existem muitos usos de ponteiro em aplicações, um típico exemplo é quando vc deseja passar alguma variável de uma dll p/ o seu .exe; vc pode fazer isso utilizando SendMessage e passar o ponteiro dessa variável através do wparam.
O * é utilizado em C/C++ como ponteiro.
GOSTEI 0
Beppe
23/02/2005
Hoje em dia eu prefiro criar classes(que são ponteiros disfarçados, mas tem um [i:af0c81f2b4]overhead[/i:af0c81f2b4] de 4 bytes por objeto). Pointeros eu uso principalmente ppara strings(PChar), e pixels(TBitmap.GetScanLine, por ex)
Eu omite intencionalmente, mas foi bom vc ter falado nele, pra ficar mais completo.
Talvez o colega Beppe esqueceu de mencionar que o operador ^ também é utilizado como ponteiro:
Eu omite intencionalmente, mas foi bom vc ter falado nele, pra ficar mais completo.
GOSTEI 0
Alysson
23/02/2005
Você tem q ter em mente, de que tudo que você está vendo, ou que esta utilizando, está na memória RAM...
Quanto mais memória RAM, mais o PC consegue guardar dados...
O Símbolo @ pega o endereço da memoria ram que o valor está contido....
exemplo:
Var
Int:Integer;
@Int = O Endereço da memória ram, que está o valor dentro da variável INT...
já que @ pega a posicao da memória RAM, o símbolo ^ faz referência a ela...
Valor^ := BLABLA // Você vai escrever na posicao da memória ram de endereço VALOR, os dados passados depois de :=
BlaBlaBla := Valor^ //Você pega o Valor contido na memória ram de endereço VALOR, e colocá-lo em BlaBlaBla, que tb é 1 memória RAM...
ou seja..
quando você faz atribuição de valores, você está nada menos, nada mais, do que COPIANDO blocos da memória RAM, para outra posiçÃO....
Quanto mais memória RAM, mais o PC consegue guardar dados...
O Símbolo @ pega o endereço da memoria ram que o valor está contido....
exemplo:
Var
Int:Integer;
@Int = O Endereço da memória ram, que está o valor dentro da variável INT...
já que @ pega a posicao da memória RAM, o símbolo ^ faz referência a ela...
Valor^ := BLABLA // Você vai escrever na posicao da memória ram de endereço VALOR, os dados passados depois de :=
BlaBlaBla := Valor^ //Você pega o Valor contido na memória ram de endereço VALOR, e colocá-lo em BlaBlaBla, que tb é 1 memória RAM...
ou seja..
quando você faz atribuição de valores, você está nada menos, nada mais, do que COPIANDO blocos da memória RAM, para outra posiçÃO....
GOSTEI 0
Paulo_amorim
23/02/2005
Olá
Em Delphi os ponteiros são muito menos usados que em outras linguagens, ainda mais as de nível mais baixo, como o C. Pelo tipo mais comum de aplicações do Delphi - aplicações comerciais e diretamente ligadas a bancos de dados - os ponteiros ficam em segundo plano.
Como disse o tnaires, não é bom mexer com ponteiros se não tem um bom motivo, pois ao mexer diretametne com a memória vc perde a ´proteção´ do alto nível que o Delphi oferece...
Até+
Em Delphi os ponteiros são muito menos usados que em outras linguagens, ainda mais as de nível mais baixo, como o C. Pelo tipo mais comum de aplicações do Delphi - aplicações comerciais e diretamente ligadas a bancos de dados - os ponteiros ficam em segundo plano.
Como disse o tnaires, não é bom mexer com ponteiros se não tem um bom motivo, pois ao mexer diretametne com a memória vc perde a ´proteção´ do alto nível que o Delphi oferece...
Até+
GOSTEI 0