簡體   English   中英

如何在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_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM