考虑这段代码:
struct myStruct
{
myStruct *next;
};
接下来是结构定义中声明的struct的指针,对吗?
下一步的效用是什么?我该如何使用它?
答案 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
永远不会被触及,但无意中(通过指针),t2
和t3
变得“触及”。
答案 3 :(得分:1)
它是一个指向同一个类的指针,并且成员变量被称为“next”,这表明它是一个链表,正如其他人所指出的那样。
如果变量是指向同一个类但指向“父”的指针,则很可能是某种父/子关系。 (例如,父窗口也是窗口小部件的GUI窗口小部件。)
您可能会问为什么允许您这样做:答案是指向数据类型的指针大小都相同,因此编译器已经知道该指针需要多少字节。
出于同样的原因,您可以在类(或结构)中指向一个只声明数据类型且未定义的类型的指针。 (很常见)。
答案 4 :(得分:0)
这是正确的。这种嵌套结构在linked lists中使用。