C++中的(星号*、点 . 与箭头 ->)
1、解引用运算符 *
int x = 10;
int* p = &x; // p 保存 x 的地址
int y = *p; // y 变成 10
*p = 20; // 改变 x 的值为 20
语义:把指针指向的那块内存“打开”成一个对象。
2、点 . 与箭头 ->
TreeNode n; // n 是对象
TreeNode* p = &n; // p 是指针n.val = 5; // 对象用点
p->val = 5; // 指针用箭头
(*p).val = 7; // 等价写法(手动解引用再点)
.:对象.成员
左边必须是对象(栈上或 new 出来的都行),不是指针。
->:指针->成员
左边必须是指针(含智能指针的 operator-> 情况)。
3、做个题
题目:
给你一个 二叉树 的根结点 root,该二叉树由恰好 3 个结点组成:根结点、左子结点和右子结点。
如果根结点值等于两个子结点值之和,返回 true ,否则返回 false 。
解题1:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool checkTree(TreeNode* root) {return (*root).val==(*(*root).left).val+(*(*root).right).val;}
};
解题2
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool checkTree(TreeNode* root) {return root->val==root->left->val+root->right->val;}
};
总结
- 解引用:把“地址”变“对象”
- . 成员访问:对象 → 成员
- -> 指针成员访问:指针 → (自动解引用) → 成员