指向C ++结构的指针

德库兹涅耶佐夫

为了完成我的作业,我必须用C ++实现一个列表,因此我定义了一个结构:

struct Node {
    int value;
    Node * next;
    Node * operator [] (int index)//to get the indexed node like in an array
    {
        Node *current = this;
        for (int i = 0; i<index; i++)
        {
            if (current==NULL) return NULL;
            current = current->next;
        }
        return current;
    }
};

当我将其与实际结构一起使用时,它可以正常工作:

Node v1, v2, v3;
v1.next = &v2;
v2.next = &v3;
v3.value = 4;
v3.next = NULL;
cout<<v1[2]->value<<endl;//4
cout<<v2[1]->value<<endl;//4
cout<<v3[0]->value<<endl;//4; works just as planned
cout<<v3[1]->value<<endl;//Segmentation fault

但是,当我尝试将其与指针一起使用时,事情变得一团糟:

Node *v4, *v5, *v6;
v4 = new Node;
v5 = new Node;
v6 = new Node;
v4->next = v5;
v4->value = 44;
v5->next = v6;
v5->value = 45;
v6->next = NULL;
v6->value = 4646;
//cout cout<<v4[0]->value<<endl; compiler says it's not a pointer
cout<<v4[0].value<<endl;//44
cout<<v4[1].value<<endl;//1851014134
cout<<v4[2].value<<endl;//45
cout<<v4[3].value<<endl;//1851014134
cout<<v4[4].value<<endl;//4646
cout<<v4[5].value<<endl;//1985297391;no segmentation fault
cout<<v6[1].value<<endl;//1985297391;no segmentation fault even though the next was NULL
delete v4;
delete v5;
delete v6;

尽管可以使用函数,但我有一些问题:

  1. 为什么在指针示例中返回的值是结构而不是指针?
  2. 为什么元素现在具有双倍索引,它们之间的元素是什么?
  3. 为什么没有分割错误?

如果有人能向我解释一下这些时刻或向我提供可以从中学习的资源,我将非常感激

巴里

这是因为v4[0](及其他)实际上并未致电给您Node::operator[]那是因为v4不是a Node,它是a Node*,并且指针背后有一个内置的含义operator[]:(v4[i] == *(v4 + i)也就是说,我们只是索引到该“数组”中)。因此,当您编写类似的内容时v4[3],这并不是在调用operator[](3)……而是在内存中的某个位置给您Node3 Nodes的时间v4,这基本上只是垃圾。

为了获得想要发生的事情,您必须首先取消引用指针:

(*v4)[0]
(*v6)[1]
// etc

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章