[fpc-pascal] Pointer question
    Michael Van Canneyt 
    michael at freepascal.org
       
    Fri Aug 11 07:37:38 CEST 2023
    
    
  
On Thu, 10 Aug 2023, Hairy Pixels via fpc-pascal wrote:
>
>
>> On Aug 10, 2023, at 4:23 PM, Hairy Pixels <genericptr at gmail.com> wrote:
>>
>> // 4) subscript (inc and dereference in one step)
>> v := i[1];
>>
>>
>> #4 was not  in the list for example so I wonder what others exist.
>
> I found another one in the typinfo.pp unit. What does,
>
> 1) taking the address of a type (@TAlignCheck) yield and
> 2) what does dereferencing nil yield?
>
> Both I've never seen before until now.
>
> type
> TAlignCheck = record
>   b : byte;
>   w : word;
> end;
> var
> p: pointer;
> begin
> p := @TAlignCheck(nil^).w;
> end;
This is a very dirty trick to get the offset of a field in a record.
Note that you're not dereferencing a type but a variable of type TAlignCheck located
at memory address zero. The address of w (this is what the expression is
doing) is then the offset of w in the record.
It's probably more clear if you write it as
  p := @(TAlignCheck(nil^).w);
Michael.
    
    
More information about the fpc-pascal
mailing list