Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';您对C,C+中的指针、引用和句柄有何深刻理解+;Java呢? 你对C、C++和java?_Java_C++_C - Fatal编程技术网

什么';您对C,C+中的指针、引用和句柄有何深刻理解+;Java呢? 你对C、C++和java?

什么';您对C,C+中的指针、引用和句柄有何深刻理解+;Java呢? 你对C、C++和java?,java,c++,c,Java,C++,C,我们通常在指定的语言级别上考虑指针、引用和句柄,这很容易让我这样的新手感到困惑 实际上,java中的所有这些概念,只是指针的封装。 所有指针都只是主内存地址的封装。 所以所有这些,只是一个封装诡计 总之,这是我个人的一瞥。你的理解是什么 欢迎与我分享。 < P> C++中的指针是指向内存中某个位置的变量。您可以通过取消引用指针来访问存储在其中的对象或数据。引用只是一个指针,它与指针有两个区别。首先,一旦引用初始化,就不能更改引用指向的对象。其次,取消引用语义被删除,这样您就可以访问引用,就好像它

我们通常在指定的语言级别上考虑指针、引用和句柄,这很容易让我这样的新手感到困惑

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

总之,这是我个人的一瞥。你的理解是什么


欢迎与我分享。

< P> C++中的指针是指向内存中某个位置的变量。您可以通过取消引用指针来访问存储在其中的对象或数据。引用只是一个指针,它与指针有两个区别。首先,一旦引用初始化,就不能更改引用指向的对象。其次,取消引用语义被删除,这样您就可以访问引用,就好像它是在堆栈上而不是在堆上分配的对象一样

在Java中,没有指针,只有引用。您使用的每个对象都是对堆上分配的对象的引用。缺点是你不能做指针数学技巧。这也是好处

编辑:
正如注释中所指出的,java引用与C++引用不同,因为它可以在初始化后重新分配。语言规范仍然称它们为“引用类型”,但行为上它们可以像指针一样被重新分配并传递给函数,但是取消它们的语义看起来像C++中的非指针访问。

这两种语言在这方面有不同之处。在C语言中,只有指针是保存内存地址的变量。在C语言中,您可以使用指针算法在内存中移动,如果您有一个数组,您可以获得指向第一个元素的指针,并通过递增指针来导航内存

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

public static void swap( Object o1, Object o2 )
{
   Object tmp = o1;
   o1 = o2;
   o2 = tmp;
}
前一段代码是一个复杂的no-op。对两个对象的引用是按值传递的,它们在方法内部使用,从调用方的角度看不会发生任何变化:真实对象不会发生任何变化,调用方对这些对象的引用也不会发生任何变化。也就是说,如果调用是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;
}
模板
无效掉期(T&a、T&b)
{
T-tmp(a);
a=b;
b=tmp;
}
< C++中的代码与java版本不同,因为它确实改变了调用方对象。如果调用者使用swap(var1,var2),那么引用将绑定到这些变量,而遭受更改的是var1和var2。调用之后,var1和var2的值实际上是交换的


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

句柄不是C++或java语言构造。它只是API提供的一个不透明标识符的名称,用于该API中的进一步调用。你的意思是句柄实际上是一组指针?@Cong:可能是,可能不是。它是不透明的,所以你不知道。句柄正是我说的。API提供的在该API中进一步使用的东西。虽然它可能以给定的方式在给定版本的API上实现,但使用实现细节是非常糟糕的,因为实现可能会更改然后破坏您的应用程序。“首先,一旦引用初始化,您就无法更改引用指向的内容。”String str1=新字符串(“更改我”)//初始化的str1 str1=“另一个值”//这是否改变了STR1参考点,一旦引用被初始化。虽然你正确地说“在爪哇,没有指针,只有引用”,但是你需要澄清java调用的“引用”与C++调用“引用”的东西完全不同。java调用引用的方式更像C++调用指针。+ 1。这实际上是迄今为止最正确的答案,至少在问题的“指针”与“参考”部分。这是个好答案,如果dribeas对“把手”给出一些意见,那将是极好的。谢谢大家。把手处于不同的级别,它们不是语言构造,而是库提供的标记,以便以后可以引用库内部管理的某些资源。最常见的情况是