"Reference variable" means, there is a hidden pointer passed on the stack. The only passed pointer is the stackpointer in pascal.
I'm going to interpret "Reference variable" as a "var" parameter. In that case, a pointer to the variable is what is passed as the parameter to the function/procedure. I'm not sure I'd consider it "hidden" since "var" implies "pointer to", though I admit, it is not obvious to some programmers.
The hidden pointer is in C, but not in Pascal.
I don't get what you are saying there. If there is one thing C does not do is hide much of anything, much less pointers. What do you mean "the hidden pointer is in C" ? can you give an example ?
So far I understand it, the data is copied to the stack and the receiving procedure treats the arguments in the same way as an ordinary local variable.
For a large data structure (one that does not fit in registers), a copy is made on the stack and a reference/pointer to that copy is used by the callee to access it. It is worth pointing out that in Free Pascal, depending on the program's bitness, the copy may be created by the caller or by the callee, IOW, who makes the copy depends on the program's bitness but, regardless of who made the copy, the structure will always be accessed through a pointer (though this fact may not be obvious to some programmers.)
There is no hidden pointer for an array, that is passed by value in pascal.
The array will _always_ be accessed using a pointer. The array identifier is a pointer to the start of the array and an array will _always_ be passed by reference. What changes, when the caller made the copy (if passed by value) is the target of the reference.
(The data must be copied to the stackframe, otherwise the procedure would not be reentrant.)
The data is copied if the parameter is passed by value and "const" isn't specified. Whether a function/procedure is re-entrant is a different matter, no language, Free Pascal included, guarantees that a function or procedure is re-entrant, it's the programmer's responsibility to make it that way.
I probably missed the point of your example code. I don't see what it's supposed to be demonstrating.