2015-06-06 45 views
2

我需要知道,如果我想打一個數組,數組的每一個元素是一個指針鏈表和數組傳遞給函數,該函數是void,因爲我需要改變陣列數組指針鏈表

typedef struct n{ 
    char *S; 
    int num; 
}list; 

int (main){ 
list *Array[50]; 
return 0; 
} 

應的功能是void changeArray(list A[]);void changeArray(list *A[]);void changeArray(list **A[]);

+0

'無效changeArray(名單* A []);' – BLUEPIXY

+0

爲什麼? 陣列時,我將它傳遞給函數取指針與它.. 數組的元素是一個地址到一個鏈表..如果更改陣列(地址)的元素的元素不發生變化的複製 – cip

+0

你可以編寫測試代碼。 – BLUEPIXY

回答

2

的功能可能是要麼void changeArray(list *A[])void changeArray(list **A)。這兩個簽名會接受一個指針數組,並讓你改變數組的元素:

void changeArray(list *A[]) { 
    ... 
    A[0] = malloc(list); 
} 
+0

爲什麼?陣列時,我將它傳遞給函數取指針與它..數組的元素是一個地址到一個鏈表..如果更改陣列(地址)的元素的元素不發生變化的複製 – cip

+0

@cip陣列傳遞給函數不會被複制。相反,他們「衰減」指針。當你在你的函數中修改'A'時,你傳遞的數組將被修改。如果你想傳遞一個數組副本,可以將它包裝在一個'struct'中,或者用'memcpy'明確地創建一個副本。 – dasblinkenlight

+0

那點!數組的元素是一個地址,如果我改變它的功能,它改變了真正的原因,爲什麼我需要一個指針呢? 爲什麼函數不會只是'void change(list A []); ' – cip

1

陣列被定義像

list *Array[50]; 

所以,如果你想這個數組傳遞給函數,那麼就應該聲明如下

void changeArray(list *Array[50], size_t n); 

void changeArray(list *Array[], size_t n); 

void changeArray(list **Array, size_t n); 

,並呼籲像

changeArray(Array, 50); 

無論如何聲明作爲函數參數的數組被調整爲指向數組元素類型的對象的指針。

+0

爲什麼?陣列時,我將它傳遞給函數取指針與它..數組的元素是一個地址到一個鏈表..如果更改陣列(地址)的元素的元素不發生變化的複製 – cip

+0

@cip的數組被轉換爲指向其第一個元素的指針,該參數將具有實際類型列表**。整個數組不會被複制到函數中。 –

+0

@cip因此,如果您要更改指針所指向的元素,您將更改原始數組而不是其副本。 –