有人可以向我解释一下:
(((((*(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];
};
答案 0 :(得分:5)
好吧,让我们摆脱一些括号来简化它:
(*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] |
| ... |
答案 1 :(得分:0)
在我看来,删除括号使其更容易阅读:
(*parent)->leaves[7]->zone_id
所以,我们有一个指向叶子指针的指针。 (*parent)
对该指针进行解引用(因此获取指针指向的内容)。所以现在我们有一个指向叶子的指针,它是一个10的数组,所以我们使用元素7,这里的指针用于获取zone_id。
确实有点复杂,但这远不是我见过的最复杂的结构。如果它对你有所帮助,你可以将其分解:
Parent *this_parent = *parent;
Leave *leaf = this_parent->leaves[7];
... use leaf->zone_id;
答案 2 :(得分:0)
(
(
(
(
(
*(parent)
)
->leaves
)
)
[7]
)
->zone_id
)
parent
leaves
成员7
元素zone_id
成员。