2011-08-04 42 views
0

關於這段代碼我有兩個問題。關於函數中指針的C問題

  1. double*** pdataint*** pmask是什麼意思?指向指針的指針? 爲什麼或什麼時候這是必要的?

  2. intdouble是不同的類型,但是double*int*也不同。我們能否在沒有演員的情況下對他們進行操作

這裏是我疑惑代碼:

static int makedatamask(int nrows, int ncols, double*** pdata, int*** pmask) 
    { int i; 
     double** data; 
     int** mask; 
     data = malloc(nrows*sizeof(double*)); 
     if(!data) return 0; 
     mask = malloc(nrows*sizeof(int*)); 
     if(!mask) 
     { free(data); 
     return 0; 
     } 
     for (i = 0; i < nrows; i++) 
     { data[i] = malloc(ncols*sizeof(double)); 
     if(!data[i]) break; 
     mask[i] = malloc(ncols*sizeof(int)); 
     if(!mask[i]) 
     { free(data[i]); 
      break; 
     } 
     } 
     if (i==nrows) /* break not encountered */ 
     { *pdata = data; 
     *pmask = mask; 
     return 1; 
     } 
     *pdata = NULL; 
     *pmask = NULL; 
     nrows = i; 
     for (i = 0; i < nrows; i++) 
     { free(data[i]); 
     free(mask[i]); 
     } 
     free(data); 
     free(mask); 
     return 0; 
    } 

回答

1

是 - 種是三指針或指針的指針的指針。偶爾他們是必要的,但是非常害怕。在這種情況下,您正在分配兩個相似大小的二維數組,並且必須通過引用返回這兩個值,因此至少在保留當前函數設計的同時,三重指針是必需的。

是 - 一個double *int *是不同的類型;他們指向不同的類型。您可以在沒有演員的情況下對其進行適當的操作。但是,如果您認爲可以將兩個並行操作合併爲一個,則可能是錯誤的。

,如果你創建了一些子功能,你的錯誤恢復可能比較簡單:

static int **alloc_2d_int_array(int nrows, int ncols) 
{ 
    ... 
} 

static double **alloc_2d_double_array(int nrows, in ncols) 
{ 
    ... 
} 

你的主要配置功能會那麼只需調用這兩個順序。如果第二個失敗,主分配函數將調用第一個分配數組的清理。清理代碼可能需要相關的大小,所以你可能會得到:

static void free_2d_double_array(int nrows, double **array) 
{ 
    ... 
} 

static void free_2d_int_array(int nrows, int **array) 
{ 
    ... 
} 

這些功能,甚至可能是源(未static)外部可見。

您也可以考慮使用結構來描述數組(行和列)以及指向數組的指針。這可以讓你避免顯式的三指針符號。

struct double_array 
{ 
    int  nrows; 
    int  ncols; 
    double **array; 
}; 

等等

+0

因此,當你指向一個**指針**指向一個double,那是什麼**指針**類型? – Programmer

+1

@編程愛好者:它是一個指向雙精度指針的指針(可以說這是一個雙精度指針,可能會出現一些混淆)。 –

1

A)***可以是一個指針,指向指針數組或指針
B)一個int雙維陣列和雙是不同類型的,沒有不能操作cast

+0

'T **'也可以是一個指向數組指針的指針,就像'T *'可能是一個指向T數組的指針(第一個元素)的指針一樣。 –

+0

讀取代碼T似乎是指向double的二維數組。 (nrows x ncols) – cprogrammer

1

double *** pdata和int *** pmask是什麼意思?指向指針的指針?

是的。

[當]這個必要嗎?

當這個函數確實需要返回一個指針指針值的時候,通過指針。你當然也可以通過值返回這些值,但是這個函數通過指針來完成它,因爲它「返回」了多個指針。

int和double是不同的類型,但是double *和int *也不同。我們能否在沒有演員的情況下對他們進行操作

我不知道你的意思,但但你不能指望投int*double*,反之亦然; intdouble對於相同的值(只要它們可以表示相同的值)和不同的大小,最有可能在內存中具有不同的表示形式。你也會違反C的「嚴格別名」規則,說

double *p = WHATEVER; 
int *q = p; 
+0

「當這個函數的時候,你想要通過指針返回一個指向指針的值。」在這裏,我們**通過指針傳遞**值,以便我們可以替換它,模擬int指針指針和double指針指針的「多次返回」。 –