【问题标题】:Significance of ** in pointers - C language** 在指针中的意义 - C 语言
【发布时间】:2013-07-22 06:48:55
【问题描述】:

我正在尝试用 C 语言对链表进行一些操作。我是一个新手,对函数append() 有点困惑。

他们在函数中传递了参数,例如struct node **q。他们将它与*q 一起使用。

C语言中的函数append()

void append(struct node **q, int num) {
    struct node *temp, *r;
    if(*q==NULL) {
        temp=malloc(sizeof(struct node));
        temp->data=num;
        temp->link=NULL;
        *q=temp;
    }
    else {
        temp=*q;
        while(temp->link!=NULL)
            temp=temp->link;
        r=malloc(sizeof(struct node));
        r->data=num;
        r->link=NULL;
        temp->link=r;
    }
}

我无法理解:-

  1. 为什么他们在参数中使用**q,在代码部分使用*q
  2. 有什么区别?和
  3. 最好的方法是什么?

任何帮助将不胜感激。

【问题讨论】:

  • 首先请注意我是如何在不更改单个单词的情况下向您提出问题的。其次让我知道您是否在功能上清楚 append() 函数
  • 你的问题号 2 应该是问题号 1

标签: c pointers data-structures linked-list


【解决方案1】:

请记住,C 中的参数是按值传递的,这意味着它们的值是被复制的。因此,要更改函数中的参数,您必须通过引用传递它。在 C 中,这是通过使用指针来完成的。但是,指针本身在传递给函数时按值传递,因此为了能够更改该指针,您必须通过引用传递 it,因此您传递它作为指针的指针。


对于您的特定代码,函数append 修改了您传递给它的指针,因此您需要使用指针的地址通过引用传递它。调用者执行以下操作:

struct node *queue;
append(&queue, ...);

那么当append返回时,q可能会改变。


函数中*q 的使用是因为一元* 运算符用于解引用指针。因此,如果您有一个指针q,那么*q 将是q 指向的值。对于您的函数,由于 q 是指向指针的指针,因此 *q 将生成原始指针。

如果使用我上面的短 sn-p 调用,那么 *q 将返回 queue 指针。

【讨论】:

    【解决方案2】:

    **q 表示 q 是指向另一个指针 p 的指针。如果我想使用 q 获得 p 的值,我必须使用 **q。 *q 将指向 q 中的值,这将是 p 的地址。再次 * 将获得 p 的值。

    【讨论】:

      【解决方案3】:

      这旨在将头指针的地址传递给append()

      我很确定,append 会这样调用,

      int main()
      {
      
      struct node *k;
      
      //calling append() function.
      append(&k);
      
      }
      

      有关一些简单示例,请参阅此处。 http://www.cplusplus.com/forum/general/13227/

      【讨论】:

        【解决方案4】:

        你必须很好地理解指针的概念。 通常,如果您使用指针,您可以使用 * 运算符 访问该指针内的值。

        例如:

        x=10; //Assume Memory Address of x is 1000. 1000 holds value 10
        int *y=&x; //Assume Memory address of y is 1100. 1100(y) holds pointer value 1000
        

        这里,

        y will hold 1000
        *y => value at y => value at 1000 => 10    
        

        让结构看起来像这样。

        struct node
        {
          int data;
          struct node *link;
        }
        

        最初您的队列是空的。

        //Initially queue is empty.
        struct node *queue=NULL;
        append(&queue,10); //append(4000,10);
        

        这里假设队列的地址是4000。

        4000 => queue => holds value 0 
        

        所以这里 4000 持有队列的开头。由于队列是空的,它持有 0。

        这里我们必须访问 4000 的值来获取第一个节点地址。因此,您将访问指向指针(当前为 0)的指针(4000)。 在这种情况下,您正在处理双指针,因此您的声明是 **q

        void append(struct node **q, int num)
        

        这里 q 将是 4000,*q => q 处的值是 NULL(零)。进入 if 块。

        if(*q==NULL) //*q => value at q is NULL(Zero)
        {
            temp=malloc(sizeof(struct node)); //assume temp=3000
            temp->data=num; //3000->data=10
            temp->link=NULL; //3000->link=NULL;
            *q=temp; //*q => value at q => value at 4000 is 3000 now.
        }
        

        现在再次调用 append

         append(&queue,20); //append(4000,20);
         4000 => queue =>  holds value 3000 //updated address in queue
        

        如果列表不为空,它将在 else 块上起作用。

        temp=*q; // temp= value at q => 3000
         //Iterate from 3000 to traverse the list and add num in the end.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-14
          • 1970-01-01
          • 2016-02-14
          • 2021-09-22
          相关资源
          最近更新 更多