Java 更改C++;指针指向

Java 更改C++;指针指向,java,c++,Java,C++,我对比较Java和C++参考文献感到困惑: 在下面的java代码中,调用changePoint后,点p对象仍然指向(5,5)对象 这是因为temp变量(在chagePoint中)是在堆栈上分配的,并保存对p对象的引用(在main中)在堆中,但当我们重新分配temp时,它只指向堆中的另一个点对象,而不改变main中原始点p对象指向的位置 public static void main(String [] args) { Point p = new Point(5,5); chang

我对比较
Java
C++
参考文献感到困惑:

在下面的java代码中,调用
changePoint
后,
点p
对象仍然指向
(5,5)
对象

这是因为
temp
变量(在
chagePoint
中)是在堆栈上分配的,并保存对
p
对象的引用(在
main
中)在堆中,但当我们重新分配temp时,它只指向堆中的另一个点对象,而不改变main中原始
点p
对象指向的位置

public static void main(String [] args) {
    Point p = new Point(5,5);
    changePoint(p);
}

changePoint(Point temp) {
    temp = new Point(4,6);
}
<>现在在C++中,如果我们在“<代码>转换点< /代码>中的这两个语句中,在主代码中发生了什么?当您执行
*temp=new Point(4,5)
时,它将简单地覆盖
(5,5)
对象,该对象是
p
从main correct>指向的对象?但是当您执行temp=newpoint(4,5)时,main中的
(5,5)
对象是否会发生内存泄漏

int main() {
    Point *p = new Point(5,5);
    changePoint(&p);
}

changePoint(Point *temp) {
    *temp = new Point(4,5);
    temp = new Point (5,6);
}

在与Java进行比较之前,您应该了解以下内容:

  • C++按引用传递与按值传递(复制)
  • 指针指向指针
  • C++中,如果要修改传递给函数的变量,则需要传递引用:

    void func1(int& value)
    {
      value = 5;
    }
    void another_function()
    {
      int number = 0;
      func(number);
      std::cout << "The value of number is: " << number << "\n";
    }
    
    void func4(int * & pointer_to_value)
    {
      pointer_to_value = new int;
      *pointer_to_value = 17;
    }
    void caller4()
    {
      int * pointer_to_number;
      func4(pointer_to_number);
    }
    
    如果要更改指针而不通过引用传递,则需要将指针传递给指针:

    void func2(int * pointer_to_value)
    {
      *pointer_to_value = 16;
    }
    void caller()
    {
      int number = 0;
      func2(&number);
      std::cout << "The value of number is: " << number << "\n";
    }
    
    void func3(int * * pointer_to_point_to_value)
    {
      *pointer_to_pointer_to_value = new int;
      **pointer_to_pointer_to_value = 23;
    }
    void caller3()
    {
      int * pointer_to_number;
      func3(&pointer_to_number);
      cout << "Number is: " **pointer_to_number << "\n";
    }
    

    就阵列而言,简化您的生活并使用
    std::vector
    。通过引用传递向量变量,如果不修改,则通过常量引用传递

    −1您的代码将无法编译。请只张贴真实代码。讨论不编译的代码和编译后的代码是没有意义的。为了消除混淆,不要比较它们。他们是不同的语言。C++语言有指针和引用,它们是不同的。C++代码不使用引用,而是使用指针。指针通过复制传递给函数。您的函数没有修改原始指针变量的内容。@1290
    *temp=新点(4,5)覆盖
    temp
    指向的实例的内容<代码>温度=新点(5,6)覆盖
    temp
    ,但它是由值提供的。将
    changePoint
    的签名更改为
    changePoint(Point*&temp)
    以使
    temp
    成为参考参数。请在调试器中查看这一点……您的Java解释似乎过于复杂
    p
    通过值传递给
    changePoint
    ——它接收引用的副本。然后指定给该副本,因此原始引用保持不变。其中没有任何内容与任何引用引用的实际
    对象相关。这就是指针在C++中的工作方式。