使用C

时间:2015-09-08 16:30:28

标签: c loops pointers struct

我有两个for循环问题。

我很擅长使用链接列表和指针。我看到一些代码试图使用for循环将数据插入到链表中。但是,for循环声明对我来说是完全陌生的,我不明白它是如何工作的。

我对典型for循环的理解包括3个部分:

  1. 声明迭代器
  2. 循环条件
  3. 递增/递减迭代器
  4. 示例:

    main()
    {
      int i;
    
      for (i = 0; i < 5; i++) {
        //do something....
      }
    }
    

    以下是一些我希望能帮助您理解我正在看的代码。

    struct labellist {
      int x;
      int y;
      struct labellist *nextlabel;
      struct labeltest *testsptr;
    };
    
    struct labellist *labelptr;
    struct labeltest {
      int z;
      struct labeltest *nexttest;
    };
    

    循环1:

    for(q = &labelptr; *q; q = &((*q)->nextlabel)) {
    

    循环2:

    for(q = &labelptr, count=0; *q && count< MAXTUBES; q = &((*q)->nextlabel), count++)
    

    这些陈述究竟意味着什么?

    编辑:感谢您的回复。我理解两个循环现在正在做什么。花了我一些时间来理解的是两个初始化变量指针q和int count; for(q =&amp; labelptr,count = 0;。

    我以前不习惯在for循环的初始化部分看到两个声明但现在已经清楚了。谢谢!

2 个答案:

答案 0 :(得分:1)

一些参考供将来使用。另请参阅C标记维基。只需将鼠标悬停在C标记上,然后点击底部的“信息”。

此处快速摘要:

  • q = &labelptr
    这是设置q指向循环开始时的labelptr。
  • *q
    这必须适用于循环继续。当*q为假时,循环结束。当q指向NULL指针或零(即NULL)时,*q将为false。
  • q = &((*q)->nextlabel)
    这得到(*q)->nextlabel
  • 的地址

for循环遍历链表,直到它到达NULL指针。很简单。

答案 1 :(得分:1)

你总是可以写

for (initializer;  test;  update)
    body;

作为

initializer;
while (test) {
   body;
   update;
}

有时会让它们更容易阅读。

循环1:

for (q = &labelptr;  *q;  q = &((*q)->nextlabel))

q开始指向labelptr;如果q不为空,请执行正文,然后按照q指针将nextlabel移至下一个标签。

循环2:

for (q = &labelptr, count=0;
     *q && count < MAXTUBES;
     q = &((*q)->nextlabel), count++)

几乎相同的事情,但是我们继续计算,如果它达到MAXTUBES次迭代,则退出循环。