20
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ポインタ型に付ける const は型名の後ろに付くと考えると憶えやすい

Last updated at Posted at 2018-09-20

const 付きのポインタ型(C++ の参照 & も同様) const T *T * const (T は任意の型名)はどう違うのか? というのをよく忘れて検索する羽目になっていましたが、型名の後ろに付くと考えることで忘れなくなりました。

どういうことかというと、まず C/C++ の言語規格で const T *T const * と同じです。多くの人は(理由はよくわかりませんが) const T * のほうが主で T const * はおまけの書き方だと考えがちですが、実は後者のほうが規則的です。
説明のためにconstがかかる範囲をカッコで括ると、T const *(T) const * となり、「Tの値はconstだがポインタはconstではない」という意味になります。同様に T * const(T *) const となり、「Tの値は const ではないがポインタは const である」という意味、T const * const ならば ((T) const *) const で「Tの値は const でありポインタも const である」という意味になります。

表にまとめてみました。こうして比較すると、const T * のように const を前につけるほうが例外的であることがわかります。

意味
T Tの値は const ではない
T const Tの値が const である
const T Tの値が const である
T const * Tの値は const だがポインタは const ではない
const T * Tの値は const だがポインタは const ではない
T * const Tの値は const ではないがポインタは const である
const (T *) こういう文法は存在しない
T const * const Tの値は const でありポインタも const である
const T * const Tの値は const でありポインタも const である
const (const T *) こういう文法は存在しない

変数名も含めた別の説明

変数名も含めると、const は型名と変数名の間に入ると言ったほうがわかりやすいかもしれません。
T const *x;*x (値)が const であり、 T * const x;x (ポインタ)が const である、となります。
あまりわかりやすくならなかった図↓

constとポインタ.png

20
16
10

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?