如何在 C++ 中通过引用传递指针
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_ptr 的引用,例如:
void readFloatData(std::unique_ptr<float[]>& fData)
void readFloatData(std::vector<float>& fData)
Your code actually works as-is(除了在使用前需要声明 readFloatData
)。问题是这是否真的是个好主意——为什么不 return 新值呢?这就是 return 值的用途,毕竟:
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>
而不是指向数组的指针。
如果一个子程序分配了一个新的缓冲区,该函数的调用者如何传递一个指针来获取地址?
我尝试过的每个声明组合都不起作用,即在调用子例程后,传递的指针没有设置为在子例程中创建的缓冲区的地址。
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_ptr 的引用,例如:
void readFloatData(std::unique_ptr<float[]>& fData)
void readFloatData(std::vector<float>& fData)
Your code actually works as-is(除了在使用前需要声明 readFloatData
)。问题是这是否真的是个好主意——为什么不 return 新值呢?这就是 return 值的用途,毕竟:
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>
而不是指向数组的指针。