您对C,C++和Java中的指针,引用和句柄的深入理解是什么?

Con*_*eng 4 c c++ java

您对C,C++和Java中的指针,引用和句柄的深入理解是什么?

我们通常会考虑指定语言级别的指针,引用和句柄,很容易让像我这样的新手混淆.

实际上java中的所有那些概念,只是指针的封装.所有指针只是主存储器地址的封装.所以所有这些,只是一个封装诡计.

以上所述,这是我个人的一瞥.你理解的是什么?

欢迎与我分享.

Dav*_*eas 8

每种语言都有这方面的差异.在C中,只有指针是包含内存地址的变量.在C中你可以使用指针算法在内存中移动,如果你有一个数组,你可以得到一个指向第一个元素的指针,并通过递增指针来导航内存.

Java引用类似于指针,因为它们引用内存中的某个位置,但您不能对它们使用指针算法.只允许分配.请注意,引用不是对象,而是访问对象的方法.这可以在参数传递语义中看到:对象不通过引用传递,引用通过值传递:

public static void swap( Object o1, Object o2 )
{
   Object tmp = o1;
   o1 = o2;
   o2 = tmp;
}
Run Code Online (Sandbox Code Playgroud)

上一段代码是一个复杂的无操作.对两个对象的引用按值传递,它们在方法内部播放,并且从调用者的角度来看没有任何反应:真实对象不会发生任何变化,调用者对这些对象的引用也没有.也就是说,如果调用是swap(ref1,ref2),系统会将引用的副本复制到o1和o2中,副本在方法中更改,但调用方变量ref1和ref2在方法调用后将保持不变.

在C++中,您有两个概念:指针与C指针相同并且接近Java引用,而C++引用是它们引用的对象的别名.C++引用只能在构造中使用一个对象/数据元素进行初始化,并且从那里开始,使用原始对象并且引用完全相同.除了引用不包含资源,因此当引用超出范围时不会调用析构函数,如果引用的对象被销毁,引用也不会被注意,对于所有其他用途,这两个名称是相同的元素.

template <typename T>
void swap( T & a, T & b )
{
   T tmp( a );
   a = b;
   b = tmp;
}
Run Code Online (Sandbox Code Playgroud)

C++中的上述代码与Java版本的不同之处在于它确实更改了调用者对象.如果调用者使用swap(var1,var2),则引用绑定到那些变量,var1和var2是受到更改的变量.调用之后,实际上交换了var1和var2的值.

句柄处于不同的级别,它们不是语言构造,而是库提供的标记,以便您以后可以引用库内部管理的某些资源.最常见的情况是整数句柄,它们是资源表中的id(或偏移),但我看到用作句柄的字符串.内部的库决定了什么是处理程序(指针,整数,字符串或更复杂的数据结构).句柄意味着不透明,因为唯一明智的用途是存储它们,然后将其作为其他函数签名的一部分返回到同一个库中.