【C/C++】const int* と int* const の違いを徹底解説!宣言の読み方のコツも紹介
はじめに:constとポインタの組み合わせ
C/C++では、「const」と「ポインタ」を組み合わせた宣言が複数存在し、それぞれ意味が異なるため、初心者がつまずきやすいポイントの一つです。この記事では、代表的な4つのパターンを整理し、何が変更できて何が変更できないのかを具体例とともに解説します。
4つの基本パターン
int* // intへのポインタ
int const * // constなintへのポインタ
int * const // intへのconstポインタ
int const * const // constなintへのconstポインタ
まず押さえておきたいのは、次の2点です。
const int *とint const *は完全に同じ意味const int * constとint const * constも同じ意味
つまり、const が型名の前についているか後についているかだけの違いで、動作には影響しません。
それぞれ何が変更できるのか?
1. int*(通常のポインタ)
ポインタ自体も、指し示す先の値も、どちらも自由に変更できます。
2. const int* / int const*(constなintへのポインタ)
指し示す先の値は変更不可ですが、ポインタが指すアドレスは変更可能です。
const int a = 10;
const int b = 20;
const int* p = &a;
*p = 30; // エラー:値の変更は不可
p = &b; // OK:指す先は変更可能
3. int* const(intへのconstポインタ)
ポインタ自体は変更できませんが、指し示す先の値は変更可能です。
int a = 10;
int b = 20;
int* const p = &a;
*p = 30; // OK:値の変更は可能
p = &b; // エラー:指す先の変更は不可
4. int const* const(constなintへのconstポインタ)
ポインタ自体も、指し示す先の値も、どちらも変更不可です。
const int a = 10;
const int b = 20;
const int* const p = &a;
*p = 30; // エラー
p = &b; // エラー
一覧表で確認
| 宣言 | 値(*p)の変更 | ポインタ(p)の変更 |
|---|---|---|
int* | ○ | ○ |
const int* / int const* | × | ○ |
int* const | ○ | × |
const int* const / int const* const | × | × |
混乱したら「スパイラルルール(時計回りの法則)」を使う
複雑な宣言を読むときに役立つのが「スパイラルルール」です。変数名から出発し、時計回りに次のポインタ記号や型へ進みながら読んでいくことで、宣言の意味を正確に把握できます。
例えば int const * const p; の場合、変数名 p から時計回りに読むと、「p は const ポインタであり、const な int を指す」という意味になります。慣れないうちは、このルールに沿って声に出して読むと理解が早まります。
まとめ
const の位置によって「値が固定されるか」「ポインタが固定されるか」が決まります。「* より左側の const は値を守り、* より右側の const はポインタを守る」と覚えておくと、実務でもすぐ判断できるようになります。
-
【C/C++】const int*、const int* const、int const* の違いをわかりやすく解説
C言語やC++では、ポインタとconst修飾子の組み合わせ方によって、複数の異なる変数宣言が存在します。「const int*」「const int* const」「int const*」など、一見よく似たこれらの宣言の違いを正確に理解することは、安全でバグの少ないコードを書くうえで非常に重要です。本記事では、これら3つの宣言の違いを、複雑な宣言を読み解く際に役立つ「時計回り/らせんルール(Clockwise/Spiral Rule)」にも触れながら、コード例とともに分かりやすく解説します。時計回り/らせんルールとは宣言の中心にある識別子から出発し、時計回りに記号をなぞっていくことで、cons
-
C++における「宣言」と「定義」の違いとは?具体例でわかりやすく解説
C++を学んでいると、「宣言(declaration)」と「定義(definition)」という2つの用語が頻繁に登場します。この2つはよく混同されがちですが、実際には明確な違いがあります。本記事では、その違いを具体例とともにわかりやすく解説します。 宣言(Declaration)とは? 宣言とは、プログラム内で使用する変数、ユーザー定義型、関数について、その型やサイズ(関数の場合は戻り値の型や引数の型・数)をコンパイラに事前に伝えることです。 重要なポイントは、宣言の段階ではメモリ上に領域が確保されないという点です。コンパイラに対して「この名前の変数や関数が後で登場しますよ」と知らせるだけの