Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's your deep comprehension of pointer,reference and Handle in C,C++ and Java?

Tags:

java

c++

c

What's your deep comprehension of pointer,reference and Handle in C,C++ and Java?

We usually think about the pointer,reference and Handle on the specify language level, it's easy to make confusion by the newbie like me.

Actually all those concept in java, just a encapsulation of pointer. All pointer just a encapsulation of main memory addresses . So all of those ,just a encapsulation wiles.

all above, it's my personal glimpse. And what's your comprehension ?

welcome to share with me.

like image 762
Cong De Peng Avatar asked Jan 24 '23 05:01

Cong De Peng


2 Answers

Each language has differences to this respect. In C there are only pointers that are variables holding a memory address. In C you can use pointer arithmetic to move through memory, if you have an array, you can get a pointer to the first element and navigate the memory by incrementing the pointer.

Java references are similar to pointers in that they refer to a location in memory, but you cannot use pointer arithmetic on them. Only assignments are allowed. Note that the reference is not the object, but a way of accessing an object. This can be seen in argument passing semantics: objects are not passed by reference, references are passed by value:

public static void swap( Object o1, Object o2 )
{
   Object tmp = o1;
   o1 = o2;
   o2 = tmp;
}

The previous piece of code is a complex no-op. References to two objects are passed by value, they are played with inside the method and nothing happens from the caller perspective: the real objects do not suffer any change, nor do the references the caller has into those objects. That is, if the call is swap( ref1, ref2 ), the system will make copies of the references into o1 and o2, the copies are changed within the method, but the caller variables ref1 and ref2 will remain unchanged after the method call.

In C++ you have two concepts: pointers are the same as C pointers and close to Java references, while C++ references are aliases into the objects they refer. C++ references can only be initialized with one object/data element in construction and from there on, using the original object and the reference is exactly the same. Besides the fact that references don't hold the resource and thus the destructor will not be called when the reference goes out of scope, nor will the reference notice if the referred object is destroyed, for all other uses the two names are the same element.

template <typename T>
void swap( T & a, T & b )
{
   T tmp( a );
   a = b;
   b = tmp;
}

The code above in C++ differs from the Java version in that it does change the caller objects. If a caller uses swap( var1, var2 ), then the references are bound to those variables, and it is var1 and var2 the ones that suffer the change. After the call, the value of var1 and var2 is actually swapped.

Handles are in a different level, they are not language construct but tokens provided by a library so that you can later on refer to some resource that the library manages internally. The most general case are integer handles that are ids (or offsets) into a resource table, but I have seen strings used as handles. It is the library internally who decides what is exactly a handler (a pointer, an integer, a string or a more complex data structure). Handles are meant to be opaque in that the only sensible use is to store them and later give it back to the same library as part of other function signatures.

like image 135
David Rodríguez - dribeas Avatar answered Feb 14 '23 10:02

David Rodríguez - dribeas


In C++ a pointer is a variable that points to a location in memory. You can access the object or data stored there by dereferencing the pointer. A reference is simply a pointer that has two distinctions from a pointer. First, you cannot change what a reference points to once the reference is initialized. Second the dereferencing semantics are removed so you can access a reference as if it were an object allocated on the stack instead of on the heap with new.

In Java, there are no pointers, only references. Every object you use is a reference to an object allocated on the heap. The downside is you can't do pointer math tricks. That's also the upside.

EDIT: As pointed out in the comments, a Java reference differs from a C++ reference in that it can be reassigned once initialized. They are still called 'reference types' by the language specification, but behaviorally they act like pointers in terms of being able to be reassigned and passed to functions, but the semantics of dereferencing them look like non-pointer access looks in C++.

like image 38
Jherico Avatar answered Feb 14 '23 09:02

Jherico