簡體   English   中英

在函數中動態分配二維數組並將其返回給主函數?

[英]Dynamic 2D array allocation in a function and return it to the main?

我寫了代碼,但不知道它是如何工作的。 該方案是在讀取外部文件的函數中動態分配2D數組

void load_array(double **(&a), int *rows, int *random_val)
{
   //I know the number of columns e.g. 3
   int i,j;
   double temp;
   FILE *fp;


   //Assign a value to random variable
   *random_val=5;


   //Read file and determine number of lines(rows) block of code
   {
      //Code goes here
   }

    a=(double **)calloc((*rows),sizeof(double *);
    for(i=0;i<(*rows);i++)
    a[i]=(double **)calloc(2,sizeof(double *); //Only 2 collumns

    i=0;

    fp=fopen("input","r");
    fscanf(fp,"%lf\t%lf\n",&a[0][0],&a[0][1])
    while(!feof(fp))
    {
       i=i+1;
       fscanf(fp,"%lf\t%lf\n",&a[i][0],&a[i][1]);
    }
    *rows=i;
    fclose(fp);

}

int main(void)
{
    double **A;
    int row_count;
    double temp;
    load_array(A,&row_count, &temp);
    return 0;
}

我不明白以下幾點:

  • 我是否必須在帶有星號的函數中使用這些值? 例如for(i=0;i<rows;i++)代替for(i=0;i<(*rows);i++)random_val=5; 而不是*random_val=5;
  • 為什么我以這種方式對數組使用**(&a)聲明函數? 而且我不明白為什么要這樣傳遞數組(沒有& )。

我的指針知識有限,我很困惑。 請不要提出std::vector 我想首先澄清這一點。

您正在混合兩種語言,因為通過引用( double **(&a) )傳遞了指針對指針參數,但是您通過calloc使用了C動態分配,而不是new[]delete[]

這只是意味着您在嘗試編寫隨機代碼之前應該閱讀一些文檔或指南。

如果變量是指針(例如int* rows ),則必須取消引用它(通過*運算符)以獲取其值或為其分配新值。

&聲明的變量(僅C ++)是對現有變量的引用(一種別名)。 double **(&a)形式傳遞數組意味着您將引用傳遞給double** ,它在幕后只是指向指針對指針( double*** )的指針。 實際上,在您的示例中,此方法用於將現有的double**傳遞給函數,以使函數初始化數組並將結果地址直接存儲在傳遞的參數中。 如果您沒有任何特定要求,則可以從函數中返回double**而不是使用引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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