ポインタにconstをつける時, 書く場所が2か所あるのは知っていましたけど3つ目は知りませんでした.
型名と*の間にconstをつけると, 先頭にconstを書いたのと同じ意味になります.
書くときは先頭に書く方だけ覚えておけばいいと思いますが, 他人のコードを読むときの参考までに
struct Vec2
{
int x = 0;
int y = 0;
};
int main()
{
Vec2 a {1, 2};
Vec2 b {2, 3};
// 1). [const 型名*]はその変数の中身を変更できない
const Vec2* p1 = &a;
p1->x = 10; // Error
p1 = &b; // OK
// 2). [型名* const]はその変数自身に別のポインタを代入できない
Vec2* const p2 = &a;
p2 = &b; // Error
p2->x = 10; // OK
// 3). [型名 const *]はその変数の中身を変更できない. 1)と同じ意味
Vec2 const* p3 = &a;
p3->x = 10; // Error
p3 = &b; // OK
// 4). 両方につけるとどっちもできない
const Vec2* const p4 = &a;
p4 = &b; // Error
p4->x = 10; // Error
Vec2 const * const p5 = &a;
p5 = &b; // Error
p5->x = 10; // Error
// 5). 1)と3)どっちもつけると dupulicate constというエラーになる
const Vec2 const* p6 = &a;
p6 = &b; // Error
p6->x = 10; // Error
}
2019/04/17 追記 ----
コメントに非常にわかりやすい説明があるのでそちらもご覧ください。