如何在 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_ptrstd::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> 而不是指向数组的指针。