c++中的指针、数据类型初始化和多指针声明是如何处理的?

问题描述 投票: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;

谁能帮我理解一下?

编辑:看完这个答案 在一行上声明多个对象指针会导致编译器错误。我的理解是。在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.