2017-02-22 61 views
-2

我越來越困惑比較JavaC++引用:更改其中一個C++指針指向

在下面的代碼Java中的Point p對象仍然指向(5,5)對象調用changePoint後。

這是因爲temp變量(在chagePoint)是在堆棧上分配,並在堆保持到p對象的引用(在main),但是當我們重新分配臨時它只是指向在堆的另一點對象而不改變main中原始對象Point p指向的位置。

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

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

現在在C++中,如果我們做exeucting在changePoint這兩個聲明後,會發生什麼情況(5,5)對象主要是一回事嗎?當你做*temp = new Point(4,5)它將簡單地覆蓋p從主指向的(5,5)對象正確嗎?但是當你做temp = new Point(4,5)時,主體中的(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); 
} 
+1

** - 1 **您的代碼無法編譯。請僅發佈**真實代碼**。討論無法編譯的代碼是沒有意義的,如果編譯的話會做什麼。 –

+2

要消除混淆,請不要比較它們。他們是不同的語言。 C++語言有指針*和*引用,它們是不同的。 –

+2

您的C++代碼不使用引用,它使用指針。指針通過複製傳遞給函數。你的函數不會修改原始指針變量的內容。 –

回答

2

您應瞭解以下比較的Java之前:

  1. C++引用與通按值傳遞(複印件)。
  2. 指向指針的指針。

在C++中,如果你想修改已傳遞給函數的變量,你需要按引用傳遞:

void func1(int& value) 
{ 
    value = 5; 
} 
void another_function() 
{ 
    int number = 0; 
    func(number); 
    std::cout << "The value of number is: " << number << "\n"; 
} 

number值將被func被改變,因爲變量傳遞引用。

如果你想使用指針而不是引用修改變量,你將需要傳遞一個指針:

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"; 
} 

更簡單的方法是通過引用傳遞指針:

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); 
} 

就陣列而言,簡化您的生活並使用std::vector。通過引用傳遞向量變量,或者如果您不會通過常量引用修改它。