?你好,我已经实现了一个link结构,并用这个做了一个列表。
typedef struct link1 {
char* a;
char* b;
int i;
struct link1* next;
};我有从列表中追加、删除等的函数。这些函数获得列表中的第一个链接。问题是在使用这些函数之后,信息没有更新。有没有办法传递第一个链接的参数,这样列表就会被更新?第一个链接来自类型:
link1* first;**我已经尝试返回第一个链接,但它起作用了,但我有嵌套的函数,并且我不能在外部函数中返回这些链接,所以我认为唯一的方法是以其他方式传递参数。
现在,我像这样发送参数:
link1* first;
func(first);
void func(link1* l){...}谢谢!
发布于 2014-04-29 06:51:11
链表操作,如追加、删除等,必须经常影响列表中的“头”节点。例如,当" head“节点被删除时,"head->next”现在必须承担新列表head节点的角色。在这种情况下,您的指针
link1* first;(指向列表的头节点)必须修改为指向" head ->next“节点。不幸的是,首先传递给这个庄园中的一个函数
func(first);不允许func()操作“first”指向的位置。为了让func()操作' first‘指向的位置,您必须将first的"address“传递给func():
func(&first);现在,如果func()执行'delete node‘或'add node’这样的操作,它的地址将是'first',因此它可以改变'first‘指向的位置:
func(struct link1 **first);
{
...
*first = head->next;
...
}发布于 2014-04-29 06:40:10
当你想使用OUT BYREF参数改变函数中的任何东西时,你应该发送一个指向你正在设置的值的指针。也就是说:如果你要设置一个int,那么你应该传递int *;如果你赋值的值是struct link1*类型的,那么你应该传递一个指向这种类型的指针(指向结构指针的指针),在那里你可以分配内存并设置调用函数的指针。
void init(struct link1 **top)
{
//assign the pointer of the calling function
*top = ...;
}调用函数代码
struct link1 *top;
init(&top);发布于 2014-04-29 09:43:32
您的问题是,您在函数中作为属性传递第一个节点的数据,而不是第一个节点的数据地址。在这种情况下,这对我们有什么影响?您在第一个节点上所做的任何更改,都只是对位于程序堆栈中的函数的局部变量所做的更改,当您的函数返回时,此变量将消失,因此您所做的更改也将消失。
看看这个,你可能会更好地理解它。假设这是ram的快照,灰色单元格是内存索引,白色单元格是相应数据:

当你有一个像b这样的变量(让我们称它为“单指针”变量),你将b作为属性传递给一个函数,你实际上传递的是b (0x1)的数据,而不是b (0x3)的地址。考虑到这一点,您可以注意到,您可以更改0x1的内容(例如,添加10并将其设置为'30'),但您不能更改0x3的内容,这正是您想要的。
如果你想在不返回任何东西的情况下更改列表的根地址,你必须传递地址的地址,或者“双指针”变量,比如c。像这样传递它,你就能够:
a)修改0x3的数据:*first = ....
b)修改0x1的数据:**first = ....
如果你想检查是否理解它,如果你首先改变数据,就会想要发生。例如:
int **temp = ....;
first = temp;现在我们已经提到了理论部分,为了遵循我的建议,您必须将您的代码更改为如下所示:
func(&first); //pass the address of first variable
.
.
func(<variableType> **first) { // receive with double star
.
.
*first = ...; // change the root using single star
.
.
}https://stackoverflow.com/questions/23352313
复制相似问题