[英]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.