Symbols like * and & can be used as operators in expressions and as part of declarations. The symbol context determines the meaning of symbols.
Int I = 42;
Int & R = I; // & immediately following the type name, so it is part of the declaration and R is a reference
Int * P; // * follows the type name, so it is part of the Declaration, and P is a pointer.
P = & I; // & appears in the expression, which is an address operator.
* P = I; // * is a quote in the expression.
Int & r2 = * P; // & it appears immediately after the type name. Therefore, it is part of the Declaration. R2 is a reference. * It appears in an expression and is a quote.
In declared statements, & and * are used to form a conforming type. In expressions, their roles are converted into operators. In different scenarios, although it is the same symbol, it can be viewed as a different symbol because of its completely different meanings.
Some symbols have multiple meanings