了解特定代码示例中的指针

时间:2014-03-21 21:23:52

标签: c list pointers

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中指针的介绍,但无论如何都无法绕过这段代码中的指针。帮助赞赏。

5 个答案:

答案 0 :(得分:1)

指针是一个保存内存地址的变量。双指针是一个变量,它保存一个存储器地址,该地址也保存一个存储器地址。这通常用于列表和多维数组。

除非它是初始声明,否则星号是解除引用运算符,这意味着它不是访问存储器地址,而是访问存储在存储器地址中的值。

Check this out.

答案 1 :(得分:1)

这是基本的C,但是......

  1. l的声明为struct element **l。 C的工作方式意味着**l指的是类型为struct element的内容,因此*l指的是struct element *类型的内容(指向struct element的指针并且普通l引用struct element **(指向struct element的指针)。
  2. 同样,tmp的声明为struct element *tmp,因此*tmpstruct 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)

上述两个答案非常全面,我只想添加两条评论。

  1. 多个星号。不要对多个星号感到困惑。它只是指向变量的指针,变量是指针本身。例如:

    int a = 10;

    int * p =&amp; a;

    int ** q =&amp; p;

    int *** r =&amp; q;

    printf(&#34;%d&#34;,*** r);

    它将输出10。

  2. 添加*时,不是。事实上,宣布&#34; int * p&#34;和&#34; int * p&#34;是相同的,而我更喜欢前者。然后p表示指针(地址),* p表示它指向的内容。

答案 4 :(得分:0)

你已经得到了很好的答案,我为Kernighan和Ritchie(K&amp; R)添加了The C Programming Language, 2nd Edition的强烈个人推荐。关于指针的章节将很好地为你清楚。