C中的以下代码应该在列表的末尾附加一个数字。我们为列表提供了以下结构:
struct element
{
int value;
struct element *next;
};
附加功能的以下代码:
void append (struct element **l, int value)
{
struct element *tmp = *l;
struct element *new = (struct element *) malloc (sizeof (struct element));
new->value = value;
new->next = NULL;
if (tmp == NULL)
*l = new;
else
{
while (tmp->next != NULL)
{
tmp = tmp->next;
}
tmp->next = new;
}
}
我不明白上面代码中指针的使用,特别是,我不知道为什么l有时会出现两个星号,有时会出现一个星号,为什么tmp有时带有星号,有时候没有。我也不明白星号在哪里作为解除引用操作符出现,以及它用于定义指针的位置。我已经阅读了C中指针的介绍,但无论如何都无法绕过这段代码中的指针。帮助赞赏。
答案 0 :(得分:1)
指针是一个保存内存地址的变量。双指针是一个变量,它保存一个存储器地址,该地址也保存一个存储器地址。这通常用于列表和多维数组。
除非它是初始声明,否则星号是解除引用运算符,这意味着它不是访问存储器地址,而是访问存储在存储器地址中的值。
答案 1 :(得分:1)
这是基本的C,但是......
l
的声明为struct element **l
。 C的工作方式意味着**l
指的是类型为struct element
的内容,因此*l
指的是struct element *
类型的内容(指向struct element
的指针并且普通l
引用struct element **
(指向struct element
的指针)。tmp
的声明为struct element *tmp
,因此*tmp
为struct element
,而tmp
是指向struct element
的指针。< / LI>
醇>
指向指针的指针是必要的,这样如果新元素是列表的头部,则可以更新调用函数中列表的头部。对*l
的赋值可确保更新调用函数中的变量。
答案 2 :(得分:1)
指针的定义始终带有*以将其标记为指针
如果您想要普通变量,则需要int i;
或struct element e;
,
和int / elements的指针是int *pi;
或struct element *pe;
。
使用正常变量i,您可以使用i
获取值,使用&i
获取地址。
指针“只是”保存地址的变量,即。一个持有数字的变量,
因此,您可以使用pi
获取已保存的地址(如果是nessecary,则为
指针变量本身的地址&pi
)
指针还能做什么:*pi
得到值
在保存的地址的东西。
两个星号是指向指针(指向某个变量)的指针
即 - 有一个指针,其保存的地址是指针b的地址,
和b中包含变量c的地址。
为什么指针对函数参数有用:
假设你在main中有一个变量i,你将i作为参数传递给函数f。
到目前为止,一切都还可以,但是:如果你想在f中使用它,那就不会持久
即。当f结束时,主要的变量值为
将与以前一样,没有变化
为什么?因为,在传递参数时,会传递副本
该功能仅更改副本(在f结束后将再次删除)。
如果你取一个指针而不是变量本身并传递i的地址,
只会复制地址编号。但这两个地址仍指向
相同的变量,所以现在你可以改变它。
如果你在main中有一个指针并希望将它传递给函数
它不仅应该改变它指向的东西,
但是指针中的地址也是如此?
- &gt;你需要一个指向指针的指针......
答案 3 :(得分:1)
上述两个答案非常全面,我只想添加两条评论。
多个星号。不要对多个星号感到困惑。它只是指向变量的指针,变量是指针本身。例如:
int a = 10;
int * p =&amp; a;
int ** q =&amp; p;
int *** r =&amp; q;
printf(&#34;%d&#34;,*** r);
它将输出10。
添加*时,不是。事实上,宣布&#34; int * p&#34;和&#34; int * p&#34;是相同的,而我更喜欢前者。然后p表示指针(地址),* p表示它指向的内容。
答案 4 :(得分:0)
你已经得到了很好的答案,我为Kernighan和Ritchie(K&amp; R)添加了The C Programming Language, 2nd Edition的强烈个人推荐。关于指针的章节将很好地为你清楚。