[当我们为树或链表建立结构时,具有这种性质:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
队列用于存储结构节点的类型是什么?我认为这是该结构的指针。
std::queue<TreeNode*> q;
但是如果我尝试像这样初始化多个节点:
TreeNode* l = nullptr, r = nullptr;
它不起作用,您必须这样做
TreeNode *l = nullptr, TreeNode *r = nullptr;
有人可以帮助我更好地理解这一点吗?
编辑:阅读此答案后Declaring multiple object pointers on one line causes compiler error 我的理解是:在C和C ++中,*绑定到声明符,而不是类型说明符。在两种语言中,声明都是基于表达式的类型,而不是对象。
然后队列如何声明其原样?
在std::queue<TreeNode*> q;
中,括号括起完整的类型名称。 (“名称”是指类型的整个声明符TreeNode *
,而不是标识符。)当使用声明符描述类型时,使用的形式就像删除了标识符的完整普通声明一样。例如,以声明TreeNode *Placeholder
开头,类型名称为TreeNode *
。
在TreeNode* l = nullptr, r = nullptr;
中,没有括号将*
与TreeNode
分组。根据C ++语法,它与l
分组。如果此处允许使用方括号,以便我们可以编写<TypeNode *> l = nullptr, r = nullptr;
,则可以正常工作。这里的问题与编写- a + b
的情况相同:规则很简单,就是-
与a
分组,因此表达式为-a + b
,而不是- (a + b)
。
您当然可以使用typedef TreeNode *TreeNodeP; TreeNodeP l = nullptr, r = nullptr;
解决此问题。这表明效果只是C ++语法结构的结果-没有内在的原因,编译器无法先接受任何类型描述,然后再接受要用该类型声明的标识符列表,但是语法设计根本不接受支持。
(这的一个结果是写int* a
会产生误导,因为文本中的标记的接近度与语法中的标记的接近度不同-*
在文本中更接近int
,但更接近到语法中的a
,因此空格会发送错误的消息。)
第二个变量r
没有声明为指针,应该尝试:
TreeNode *l = nullptr, *r = nullptr;
TreeNode*
是一种类型,类似于char
或int
,但是如果在同一行中对其进行声明,则必须使用*
间接运算符,以便编译器知道特定变量是指向的指针。对象,而不是对象。当在deque
或vector
或类似内容中声明它时,您还必须能够分辨出所允许的tpyes是指向一个或多个对象的指针,因此必须在尖括号中声明TreeNode*
。
如果您考虑一下,从语义上讲就很有意义。