[英]How to Pass Pointer by Reference in C++
如果子例程分配了一個新的緩沖區,那么該函數的調用者如何傳遞一個指針來獲取地址?
我嘗試過的每個聲明組合均無效,即,調用子例程后,傳遞的指針未設置為該子例程中創建的緩沖區的地址。
int main ()
{
float *fMyBuffer;
// Pointer Update
readFloatData ( fMyBuffer ); // &fMyBuffer *fMyBuffer
// Deallocate Memory
delete [] fMyBuffer;
}
void readFloatData(float *&fBuffer) //*fBuffer &fBuffer
{
// Create New Buffer
float *fData;
fData = new float [1000];
// Pass our buffer Address to user's pointer
fBuffer = fData;
}
使用雙層指針?
float **fBuffer
可以正常工作。
這通常是通過傳遞雙指針來完成的,或者真正的C ++方法是使用std::unique_ptr
或std::vector
:
向量:
int main(int argc, char** argv)
{
std::vector<float> fMyBuffer = readFloatData ();
return 0;
}
std::vector<float> readFloatData()
{
// Create New Buffer
std::vector<float> fData(1000);
// Populate vector...
return fData;
}
unique_ptr:
int main(int argc, char** argv)
{
std::unique_ptr<float[]> fMyBuffer = readFloatData (); // Note the [] is MUST else the wrong deleter will be used
return 0;
}
std::unique_ptr<float[]> readFloatData()
{
// Create New Buffer
std::unique_ptr<float[]> fData(new float[1000]);
// Populate data...
return fData;
}
雙指針:
int main(int argc, char** argv)
{
float* fMyBuffer = nullptr;
readFloatData(&fMyBuffer);
delete[] fMyBuffer;
return 0;
}
void readFloatData(float** fData)
{
if (fData)
{
// Create New Buffer
*fData = new float[1000];
// Populate data...
}
}
正如Konrad Rudolph所說,也可以引用指針:
int main(int argc, char** argv)
{
float* fMyBuffer = nullptr;
readFloatData(fMyBuffer);
delete[] fMyBuffer;
return 0;
}
void readFloatData(float*& fData)
{
// Create New Buffer
fData = new float[1000];
}
請注意,您還可以傳入對矢量或unique_ptrs的引用,例如:
void readFloatData(std::unique_ptr<float[]>& fData)
void readFloatData(std::vector<float>& fData)
您的代碼實際上按原樣工作 (除了使用前需要聲明readFloatData
的事實)。 問題是這是否真的是一個好主意-為什么不返回新值呢? 畢竟,這是返回值的用途:
float* readFloatData()
{
// Create New Buffer
float *fData = new float [1000];
// Pass our buffer Address to user's pointer
return fData;
}
int main() {
float* fMyBuffer = readFloatData();
// …
delete [] fMyBuffer;
}
也就是說,原始指針無論如何都不應該擁有內存。 請使用std::unique_ptr
或類似的名稱。 對於數組,請使用std::vector<float>
而不是指向數組的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.