【问题标题】:Pointer-to-pointer access指针对指针访问
【发布时间】:2012-12-28 13:50:29
【问题描述】:

谁能给我解释一下:

(((((*(parent))->leaves))[7])->zone_id)

指向指针的指针真的让我感到困惑。这是我在调试模式下从手表得到的表达式。我正在尝试访问树的最后一个元素内的字符串zone_id(有 10 个元素,每个元素对应不同的数字 0-9)。

编辑:这是整个搜索功能,希望它足以理解:

string Tree::search(string str, node** parent, int num) {

    int value;

    if (num < str.length()) {

        value = boost::lexical_cast<int> (str.substr(num, 1));

        if ((*parent)->leaves[value] != NULL  &&  num != str.length() -1) {

            search (str, &((*parent)->leaves[value]), num+1);


        } else if (num == str.length() -1) {

            if ( (*(parent)->leaves)[value]->zone_id.empty() )
                cout<<"Yep.";
            else
                return (string) "No_results.";

        }

    } 


}

和结构:

struct node {

    string zone_id;
    node* leaves [10];

};

【问题讨论】:

  • 您对此有何困惑?你不明白为什么它的工作?或者它应该如何工作?
  • 您对参数使用双指针对我来说似乎没有必要。为什么不const node*?此外,只有在找不到空的 zone_id 时才返回任何内容,这肯定会在您以后使用不存在的返回值时导致重大问题(如分段错误)。

标签: c++ pointers tree


【解决方案1】:

好吧,让我们去掉一些括号来简化一下:

(*parent)->leaves[7]->zone_id

现在更容易理解了。我们正在取消引用parent (*parent),它为我们提供了一个指向某个对象的指针,该对象具有一个名为leaves 的数组成员。所以我们使用索引 7 访问该数组的元素,这给了我们另一个指针,这一次指向一个对象,该对象有一个名为 zone_id 的成员。然后我们访问该zone_id 成员。

这一切都假设不涉及运算符重载。

图表(箭头是“指向”):

 ________     _________     ___________         ___________
| parent |-->| *parent |-->|  struct:  |   ,-->|  struct:  |
|________|   |_________|   | leaves[0] |   |   | zone_id   |
                           | leaves[1] |   |   | ...       |
                           | leaves[2] |   |
                           | leaves[3] |   |
                           | leaves[4] |   |
                           | leaves[5] |   |
                           | leaves[6] |   |
                           | leaves[7] | --'
                           | leaves[8] |
                           | ...       |

【讨论】:

  • 漂亮的图表!我想,对于那些还不太直观地理解指针的人来说尤其有用。
  • 是的,确实如此。我已经为树实现了search 函数,最后在搜索结束时我必须访问zone_id,但编译器不断给我错误:Run failed。我的表情是:if ( !(*(parent)-&gt;leaves)[value]-&gt;zone_id.empty() )
  • 编译器给你那个错误?或者是当你执行你的程序时?它没有说“分段错误”或其他错误吗?
  • 嘿,@sftrabbit 刚刚在原问题中添加了搜索功能,你能看看吗?
  • @antimatter 这可能意味着您的 leaves 数组没有 8 个元素或您的指针未指向有效对象。
【解决方案2】:

在我看来,删除括号实际上更容易阅读: (*parent)-&gt;leaves[7]-&gt;zone_id

所以,我们有一个指向叶子指针的指针。 (*parent) 取消引用该指针(因此获取指针指向的内容)。所以现在我们有一个指向叶子的指针,它是一个10的数组,所以我们使用元素7,这里的指针是用来获取zone_id的。

它确实有点复杂,但这远不是我见过的最复杂的结构。如果它对您有帮助,您可以将其分解:

Parent *this_parent = *parent;

Leave *leaf = this_parent->leaves[7];

... use leaf->zone_id;

【讨论】:

    【解决方案3】:
    (
      (
        (
          (
            (
              *(parent)
            )
            ->leaves
          )
        )
        [7]
      )
      ->zone_id
    )
    
    • 取消引用parent
    • 访问leaves 成员
    • 索引7th 元素
    • 访问zone_id 成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多