【问题标题】:Array of pointers to linked list指向链表的指针数组
【发布时间】:2015-06-06 10:45:29
【问题描述】:

我需要知道是否要创建一个数组,数组的每个元素都是指向链表的指针,并将数组传递给函数,函数是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[]);

【问题讨论】:

  • void changeArray(list *A[]);
  • 为什么?当我将数组传递给函数时,它会带上指针..数组的元素是链表的地址..如果更改数组的元素(地址),则元素会更改而不是副本
  • 你可以写测试代码了。
  • 它有效,但我需要一个答案 O.o
  • 其他的不符合类型。

标签: c arrays pointers linked-list


【解决方案1】:

函数可以是void changeArray(list *A[])void changeArray(list **A)。两个签名都将接受一个指针数组,并让您更改该数组的元素:

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

【讨论】:

  • 为什么?当我将数组传递给函数时,它会带上指针..数组的元素是链表的地址..如果更改数组的元素(地址),则元素会更改而不是副本
  • @cip 传递给函数的数组不会被复制。相反,它们“衰减”为指针。当您在函数内修改A 时,您传递的数组将被修改。如果您想传递数组的副本,请将其包装在 struct 中,或使用 memcpy 显式制作副本。
  • 重点!数组的元素是一个地址,如果我在函数中改变它,它实际上会改变为什么我需要一个指针呢?为什么函数不只是void change(list A[]);
  • @cip 因为你的Array 是一个指针数组。数组的每个元素都是指向列表的指针,但数组本身变成了双星指针,即指向指针的指针。如果Array 被声明为list Array[50],那么void change(list A[]); 将是正确的签名。但是,由于您使用星号声明它,即list *Array[50],因此您需要在接收数组的函数的签名中添加第二个星号。
【解决方案2】:

数组定义如下

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 );

在任何情况下,将数组声明为函数参数都会调整为指向数组元素类型对象的指针。

【讨论】:

  • 为什么?当我将数组传递给函数时,它会带上指针..数组的元素是链表的地址..如果更改数组的元素(地址),则元素会更改而不是副本
  • @cip 数组被转换为指向其第一个元素的指针,即参数将具有实际类型列表**。整个数组不会复制到函数中。
  • @cip 因此,如果您要更改指针指向的元素,您将更改原始数组而不是其副本。
猜你喜欢
  • 1970-01-01
  • 2018-07-28
  • 2012-08-11
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2016-07-30
相关资源
最近更新 更多