C ++:结构定义问题中指向struct的指针

时间:2012-04-30 13:41:01

标签: c++ pointers struct definition next

考虑这段代码:

struct myStruct
{
    myStruct *next;
};

接下来是结构定义中声明的struct的指针,对吗?

下一步的效用是什么?我该如何使用它?

5 个答案:

答案 0 :(得分:4)

似乎它是链接列表的实现。

答案 1 :(得分:2)

如果您想将这些结构链接在一起以便以后遍历它们,则可以使用next。当然,在myStruct中拥有其他成员会更有意义。

示例:

struct myStruct
{
    int       data;
    myStruct *next;
};

myStruct st_1;
myStruct st_2;

st_1.data = 1;
st_2.data = 2;

st_1.next = &st_2; //st_1.next->data is now 2

答案 2 :(得分:1)

此指针的实用程序是您在myStruct中实现的任何内容。您可以使用此指针与其他myStruct结构(通过指针)保持直接关系,并直接操作它们(即“了解”其他对象)。

例如(注意,对于所有意图和目的,C ++中的struct是公共类),

class Test
{
public:
  doSomethingToTheOtherStruct() {
    if(t != NULL)
      t->touch();

  setTouched(bool touch) {
    touched = touch;
  }

  setT(Test* other) {
    t = other;
  }

  bool isTouched() const {
    return touched;
  }

private:
  Test* t;
  bool touched;
};

这个类有一些非常简单的方法可以证明使用指针的能力。现在使用它的一个例子如下。

#include <iostream>
using namespace std;
int main()
{
  Test t1;
  Test t2;
  Test* t3 = new Test;

  // Notice that we set the pointers of each struct to point to a different one
  // This is not necessary, but is definitely more useful than setting it to itself
  // since you already have the "this" pointer in a class.
  t1->setT(&t2);
  t2->setT(t3);
  t3->setT(&t1);

  cout<< t1.isTouched() << t2.isTouched() << t3->isTouched() << endl;

  t1->doSomethingToTheOtherStruct();
  t2.doSomethingToTheOtherStruct();

  cout<< t1.isTouched() << t2.isTouched() << t3->isTouched() << endl;

  delete t3;

  return 0;
}

请注意此代码的结果。 t1永远不会被触及,但无意中(通过指针),t2t3变得“触及”。

答案 3 :(得分:1)

它是一个指向同一个类的指针,并且成员变量被称为“next”,这表明它是一个链表,正如其他人所指出的那样。

如果变量是指向同一个类但指向“父”的指针,则很可能是某种父/子关系。 (例如,父窗口也是窗口小部件的GUI窗口小部件。)

您可能会问为什么允许您这样做:答案是指向数据类型的指针大小都相同,因此编译器已经知道该指针需要多少字节。

出于同样的原因,您可以在类(或结构)中指向一个只声明数据类型且未定义的类型的指针。 (很常见)。

答案 4 :(得分:0)

这是正确的。这种嵌套结构在linked lists中使用。