我在读Skeina的书。我无法理解这段代码。基本上双指针的用途是什么。 *l = p
有什么用?任何人都可以通过图解释。
void insert_list(list **l, item_type x) {
list *p; /* temporary pointer */
p = malloc(sizeof(list));
p->item = x;
p->next = *l;
*l = p;
}
答案 0 :(得分:0)
你不应该把它称为"双指针"因为那是指向Trip ('A', 'B', 1.0, 2.0) used: 1.0
Trip ('B', 'C', 2.0, 3.0) used: 1.0
Trip ('C', 'B', 3.5, 4.5) used: 1.0
Trip ('B', 'A', 4.5, 5.5) used: 0.0
Trip ('D', 'E', 1.0, 5.5) used: 0.0
的指针。它是指向指针的指针,它用于允许函数改变恰好是指针的参数的值。如果您熟悉C#,它就像/
个参数。在这种情况下,Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^categories/([0-9]+)/?$ /categories.php?id=$1 [L,NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [L,NC]
参数用于获取IN和OUT行为,但您可能经常看到这仅用于输出。
由于此函数返回类型double
,因此可以在不使用指向这样的指针的情况下编写它:
out
此更改需要调用该函数的代码更新它自己的列表句柄,因为列表的头部正在被更改。
答案 1 :(得分:0)
此函数执行一项非常简单的任务:它在{@ 1}}处插入一个节点
它接收指针的位置。空无一物
特别关于双指针,它们只是指针的指针。它们保存指针的地址,该指针包含对象的地址。
list
包含void **l
指针的地址。 list *
检索
这个地址和*l
存储它。
*l = p
用于分配a
malloc
结构,list
接收已分配结构的地址。
代码有些草率,因为p
之前未检查过p
解除引用它。如果NULL
由于缺乏记忆而失败,那么
程序将调用未定义的行为,希望停止使用
分段错误或可能更糟糕的事情。
节点已初始化,其malloc
指针设置为指向的节点
通过next
参数,最后存储新节点的地址
在作为l
参数传递的地址处。效果很简单:节点插入l
。
这种方法很聪明,它允许相同的功能在列表中的任何地方插入新节点。例如:
*l
上面唯一棘手的问题是指针本身的概念,这里有一个简单的概述:
list *head = NULL;
...
/* Insert a LIST_A node at the beginning of the list */
insert_list(&head, LIST_A);
...
/* insert a LIST_B element as the second node in the list */
insert_list(&head->next, LIST_B);
...
/* find the end of the list */
list *node;
for (node = head; node->next; node = node->next)
continue;
/* insert a LIST_Z node at the end of the list */
insert_list(&node->next, LIST_Z);
变量是单个字节,char
变量占用系统体系结构特定的字节数,通常为当前硬件中的4或8个字节。int
,它不代表任何对象,用于指定给定指针不指向任何真实对象。地址NULL
用于此目的。 0
将返回malloc
如果无法分配请求的内存,则应测试返回值,因为在此地址存储值是被禁止的,并且通常被捕获为无效访问(分段错误)。这个摘要是故意简化的。我使用术语变量而不是 object 来避免与OOP概念混淆。