[英]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]
的結果分配給該副本,但main
的ptr
保持不變。 為了能夠修改作為參數傳遞的指針,您需要通過引用來使用它:
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 ++中的所有內容均按值傳遞。 x
是y
的副本 ,因此對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.