2015-06-06 28 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因此,如果您要更改指针所指向的元素,您将更改原始数组而不是其副本。 –