<br>Frank,<br><br>I think the crux of the matter here is how to make the distinction between a pointer with 'no value' and one that is initialized or set to the 'lowest possible value in the range'. The quote I mentioned comes directly from Borland's Object Pascal  Langage Manual<br>

<br>You can check on this, but when I looked it up the 'nil' constant in a Object Pascal Language reference and what the reserved word
'nil' , a special constant, means in terms of pointer value (it's not an address) I was not able to find  and what adding/subtracting/multiplying it by  a literal numeric value (or another valid pointer value) to 'nil' would create. <br>

<br>If you're interested in the details (they are very instructive) compile a sample program with the two programs on an Intel based machine and then check the generated code with the GNU Debugger. Set a break point on the following statement <br>

<br><div style="margin-left: 120px;">p := nil; <br><br></div>and then single step to the next instruction. You'll see immediately that two things happen: 1) the value assigned to 'p' by that statement is not a valid segment/offset address (i32/i64 architecture). If you then set another breakpoint on the next instruction,  <br>

<br><div style="margin-left: 80px;"><div style="margin-left: 40px;">p := p + 1; <br></div><br></div>you'll notice that the first thing that happens is 'p' get set to a valid segment address and then the offset, and not the base segment, is incremented by a value of '1' (again on a Intel CPU machine). Things get even more interesting when 'p' is first typed, to an Integer for example, and then assigned the 'nil' value.   .... <br>

<br><div style="margin-left: 160px;"> var<br></div><div style="margin-left: 120px;"><div style="margin-left: 80px;">R:  Integer ;<br></div></div><div style="margin-left: 160px;"><div style="margin-left: 40px;">P:  Pointer;<br>

IntArray1, IntArray2: array of Integer; <br>IP:   ^Integer;<br>IntArrayPtr: Pointer;<br></div>begin<br><div style="margin-left: 40px;">P := nil;<br>P := @R;<br><br>P := P + 1;<br><br>P := nil;<br><br>IntArray[0] := 1;<br>

IntArray[1] := 1;<br><br>IP := @IntArray[0]<br><br>IP := IP + 1;<br> <br>IntArrayPtr := @IntArray[1];<br><br>if  IntArrayPtr^ <> IP^ then Writeln ("Integer Array values not the same");<br></div>end.<br></div>

<br>Setting breakpoints on the statements where values are assigned to 'P' and 'IP' and watching how their values are set, incremented, and dereferenced will demonstrate how challenging even a simple pointer handling model can be. <br>

<br><div class="gmail_quote">On Mon, May 25, 2009 at 10:57 PM, Frank Peelo <span dir="ltr"><<a href="mailto:f26p@eircom.net">f26p@eircom.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<div class="im">Prince Riley wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hello,<br>
<br>
</blockquote></div></blockquote><div><br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<br>
<br>
"The reserved word nil is a special constant that can be assigned to any pointer. When nil is assigned to a pointer, the pointer doesn't reference anything."<br>
<br>
Since a pointer is a memory address  value, then the interpretation of the statement "nil +1" would mean for p to point at the very next valid address above the lowest memory address 'p' can hold.<br>
</blockquote>
<br></div>
That is an "interesting" interpretation of "doesn't reference anything". There is no guarantee that nil is address 0, although it may be so in any available compiler -- at least, any compiler targetting an architecture that does not have usable memory at address 0. Nil doesn't point at anything. It's an undefined address.<div class="im">

<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
So it would appear that 'p := nil + 1' should not compile or work.<br>
</blockquote>
<br></div>
That would be reasonable - although if nil /was/ 0, then nil+1 would be defined for any given pointer type, and a compiler /could/ make a stab at compiling it -- but probably /should not/. Because what would "1 more than undefined" mean?<br>

<font color="#888888">
<br>
FP</font><div><div></div><div class="h5"><br>
<br>
<br>
<br>
_______________________________________________<br>
fpc-pascal maillist  -  <a href="mailto:fpc-pascal@lists.freepascal.org" target="_blank">fpc-pascal@lists.freepascal.org</a><br>
<a href="http://lists.freepascal.org/mailman/listinfo/fpc-pascal" target="_blank">http://lists.freepascal.org/mailman/listinfo/fpc-pascal</a><br>
</div></div></blockquote></div><br>