考虑那段代码:
struct myStruct
{
myStruct *next;
};
接下来是结构定义中声明的结构指针,对吧?
- 下一个 - 的用处是什么?我该如何使用它?
考虑那段代码:
struct myStruct
{
myStruct *next;
};
接下来是结构定义中声明的结构指针,对吧?
- 下一个 - 的用处是什么?我该如何使用它?
似乎它是链表的实现。
如果您想将这些结构链接在一起以便稍后遍历它们,您可以使用 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
这个指针的用途是你在myStruct
. 您可以使用此指针与其他结构保持直接关系myStruct
(通过指针)并直接操作它们(例如“了解”其他对象)。
例如(请注意,出于所有意图和目的,C++ 中的结构都是公共类),
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
从未设置为 touched,而是无意中(通过指针),t2
并t3
成为“touched”。
正如其他人指出的那样,它是指向同一个类的指针并且成员变量被称为“next”这一事实表明它是一个链表。
如果变量是指向同一类但称为“父”的指针,则很可能是某种父/子关系。(例如 GUI 小部件,其父级也是小部件)。
您可能会质疑为什么允许您这样做:答案是指向数据类型的指针大小都相同,因此编译器已经知道该指针需要多少字节。
出于同样的原因,您可以在您的类(或结构)中拥有一个指向仅声明了数据类型而未定义其数据类型的类型的指针。(很常见)。
那是对的。这种嵌套结构用于 链表。