簡體   English   中英

將指針傳遞給C ++中的函數

[英]Passing pointer to a function in C++

我寫了下面的代碼

#include <iostream>

using namespace std;

void temp (int * x)
{
    x=new int [2];
    x[0]=1;
    x[1]=2;
}

int main()
{
    int *ptr;
    temp(ptr);
    cout<<ptr[0]<<endl;
    cout<<ptr[1]<<endl;
    return 0;
}

運行它會導致seg錯誤,那么在temp函數內部發生的內存分配對函數來說是本地的嗎? temp返回時,內存被釋放了嗎? 我知道,要解決此問題,我需要將指針傳遞給指針ptr ,但仍然為什么這東西不起作用?

C ++答案:

您正在按值將int*參數傳遞給temp 這意味着您正在將ptr復制到函數中,並且指針x是一個完全獨立的對象。 然后,您將new int[2]的結果分配給該副本,但mainptr保持不變。 為了能夠修改作為參數傳遞的指針,您需要通過引用來使用它:

void temp (int*& x)
{ 
  // ...
}

這意味着x現在引用作為參數傳遞的指針。 這里的替代解決方案是返回一個int*

int* temp()
{
    int* x = new int [2];
    x[0]=1;
    x[1]=2;
    return x;
}

int main()
{
    int *ptr = temp();
    // ...
}

但是, temp的調用者可能不清楚int對象的所有權。 他們需要delete[]它,但是在界面中沒有明確指出。 相反,您可以返回std::unique_ptr

要更改C函數中的某些內容,您需要向其傳遞一個指針。 在這種情況下,您想要更改一個指針,因此需要一個指向指針的指針:

void temp (int** x)

然后在函數中使用*x ,其中現在有x (您需要(*x)[n] ,因為*x[n]表示其他含義)

然后使用以下命令調用temp

temp(&ptr);

這應該可以在C中解決,並且可以在C ++中工作。

在C ++中,您還可以將引用傳遞給指針:

 void temp(int*&x)

這將允許您已經使用的語法保持不變。

考慮一下這段代碼

void temp(int x)
{
    x = 2;
}

int main()
{
    int y = 3;
    temp(y);
    cout << y << '\n';
}

輸出將是2還是3 當然是三個。 現在,此示例與您的示例有什么區別? 沒事 除非使用引用,否則C ++中的所有內容均按值傳遞。 xy副本 ,因此對x更改永遠不會影響y 無論所涉及的類型是什么,都是整數,還是指針都是如此。

int *ptr;

您在此處創建了一個自動變量,並將其傳遞給

temp(ptr);

這是通過復制傳遞的,因此x將獲得ptr的值,並且x范圍在temp函數內。 它是該范圍內的一個自動變量。當您從temp返回時,其值將丟失。 現在, x分配和指向的內存絕不會反映到main中的ptr 它們沒有連接

您需要執行temp(int*& ptr)即通過引用傳遞。 temp(int** ptr)即按地址傳遞

注意:您的temp內存有泄漏

您需要傳遞**,因為您是在函數內部分配x。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM