Re: Pointers in Java: Was Re: Strings...immutable?
Chris Uppal wrote:
Mike Schilling wrote:
Also, Java references are opaque pointers. They may be addresses.
They may be phone numbers :-). They may be something totally weird.
That is an implementation matter.
Are there languages where this isn't true? I don't know of any C or
C++ implementations that don't use machine addresses as pointers,
but I presume an implementation that used something else would be
strictly conforming.
I have been told that C for early Macs used some sort of indirection
arrangement for its pointers instead of raw addresses. Certainly,
and by design, there is nothing built in to the C std that makes raw
addresses mandatory (I don't think "raw addresses" even exist in all
target architectures).
Which, I suspect, involved a base + offset implementation for pointers, with
the base being the indirected part. (Think of the number of indirect
pointers that would otherwise be required for all the members of an array.)
But returning to an earlier observation of Patricia's. C's pointers
differ from Java's references in more than one fundamental way -- not
only do they have pointer arithmetic, but the universe of "things" to
which they can point is different. In C (as, iirc, in Pascal) a C
pointer can point to any variable (caveats about the obsolete
"register" qualifier aside). Hence, in C, pass-by-reference can be
implemented at the application-code level (or emulated if you prefer
to call it that):
void
swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
called as:
void
some_function()
{
int x = 0;
int y = 100;
swap(&x, &y);
}
In C, yes. Pascal, like Java, doesn't have an "address-of" operator. In
both, pointers always point to dynamically allocated objects. I think it's
a true statement that the only difference between Pascal and Java pointers
is that Java allows some data types to be pointed to (and, in fact, never
accessed except via pointers), while Pascal allows all data types either to
be pointed to or to be accessed directly.