关于指针,数据类型初始化和多指针声明的小困惑

问题描述 投票:0回答:2

[当我们为树或链表建立结构时,具有这种性质:

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 ++中,*绑定到声明符,而不是类型说明符。在两种语言中,声明都是基于表达式的类型,而不是对象。

然后队列如何声明其原样?

c++ pointers syntax
2个回答
0
投票

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,因此空格会发送错误的消息。)


3
投票

第二个变量r没有声明为指针,应该尝试:

TreeNode *l = nullptr, *r = nullptr;

TreeNode*是一种类型,类似于charint,但是如果在同一行中对其进行声明,则必须使用*间接运算符,以便编译器知道特定变量是指向的指针。对象,而不是对象。当在dequevector或类似内容中声明它时,您还必须能够分辨出所允许的tpyes是指向一个或多个对象的指针,因此必须在尖括号中声明TreeNode*

如果您考虑一下,从语义上讲就很有意义。

© www.soinside.com 2019 - 2024. All rights reserved.