GARANTIR DESCONTO

Fórum Símbolos @ e ^ #269903

23/02/2005

0

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


Wart

Wart

Responder

Posts

23/02/2005

Beppe

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


Responder

Gostei + 0

23/02/2005

Wart

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


Responder

Gostei + 0

23/02/2005

Beppe

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...


Responder

Gostei + 0

24/02/2005

Tnaires

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?


Responder

Gostei + 0

24/02/2005

Kapak

Talvez o colega Beppe esqueceu de mencionar que o operador ^ também é utilizado 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.


Responder

Gostei + 0

24/02/2005

Beppe

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)

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.


Responder

Gostei + 0

27/02/2005

Alysson

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....


Responder

Gostei + 0

28/02/2005

Paulo_amorim

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é+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar