<table> <thead> <tr> <th>Expression</th> <th>Explanation</th> <th> Can change `p`? </th> <th> Can change `*p`? </th> </tr> </thead> <tbody> <tr> <td> ```cpp const X * p X const * p ``` </td> <td> `p` points to an `X` that is `const`. </td> <td> **+** </td> <td> **-** </td> </tr> <tr> <td> ```cpp X * const p ``` </td> <td> `p` is a `const` pointer to an `X` that is non-`const`. </td> <td> **-** </td> <td> **+** </td> </tr> <tr> <td> ```cpp const X * const p X const * const p ``` </td> <td> `p` is a `const` pointer to an `X` that is `const`. </td> <td> **-** </td> <td> **-** </td> </tr> <tr> <td> ```cpp const X& r X const& r ``` </td> <td> `r` is a reference to an `X` that is `const`. It means `r` aliases an `X` object, but you can’t change that `X` object via `r`. </td> <td> **-** </td> <td> *Not appliable* </td> </tr> <tr> <td><s> ```cpp X& const r ``` </s></td> <td> **Don't do it: it is nonsense.** `r` is a `const` reference to an `X`. That is redundant — references are always `const`. `X& const r` is functionally equivalent to `X& r`. </td> <td> **+** </td> <td> *Not appliable* </td> </tr> </tbody> </table>