C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C/C++】const int*、const int* const、int const* の違いをわかりやすく解説

C言語やC++では、ポインタとconst修飾子の組み合わせ方によって、複数の異なる変数宣言が存在します。「const int*」「const int* const」「int const*」など、一見よく似たこれらの宣言の違いを正確に理解することは、安全でバグの少ないコードを書くうえで非常に重要です。

本記事では、これら3つの宣言の違いを、複雑な宣言を読み解く際に役立つ「時計回り/らせんルール(Clockwise/Spiral Rule)」にも触れながら、コード例とともに分かりやすく解説します。

時計回り/らせんルールとは

宣言の中心にある識別子から出発し、時計回りに記号をなぞっていくことで、const や * が何に対して適用されているのかを機械的に判断できる読み方のルールです。これを使うと、「ポインタ自身が定数なのか」「指し示す先が定数なのか」を整理しやすくなります。

1. const int*(定数intへのポインタ)

「const int*」は、ポインタ型の変数であり、定数のintのアドレスを格納できることをコンパイラに伝える宣言です。ポインタが指し示す先の値は読み取り専用として扱われます。

const int* p;
int value = 10;
p = &value;   // OK:ポインタ自体は別のアドレスを指せる
*p = 20;      // エラー:ポインタ経由での値の変更は不可

つまり、ポインタの指す先を後から変えることはできますが、その先の値を書き換えることはできません。

2. const int* const(定数intへの定数ポインタ)

次に「const int* const」です。これは定数ポインタ変数であり、定数のintのアドレスを格納することを表します。ポインタ自身も定数であるため、一度初期化したら指し示す先を変更できません。

int value = 10;
int another = 20;
const int* const p = &value;
p = &another; // エラー:ポインタ自体の変更は不可
*p = 30;      // エラー:指す先の値の変更も不可

この宣言では、ポインタの変更もポインタ経由の値の変更も、どちらも一切許されない、完全な読み取り専用の組み合わせとなります。

3. int const*(定数intを指すポインタ)

3つ目は「int const*」です。これも変数がポインタ型であり、定数のintを指し示せることを表します。使い方は「const int*」とまったく同じです。

int const* p;
*p = 20;      // エラー:ポインタ経由での値の変更は不可

const int* と int const* は同じ意味

ここまで見ると分かるように、「const int*」と「int const*」は完全に同じ意味です。const が型名の前かにても後ろにても、* より左側にある限り意味は変わらないため、この2つは互換的に使用できます。

補足:int* const との違い

比較のために「int* const」(定数ポインタ)も挙げておきます。const が * の右側に付く場合、ポインタ自体は変更できませんが、指し示す先の値は変更可能です。

int value = 10;
int another = 20;
int* const p = &value;
p = &another; // エラー:ポインタ自体の変更は不可
*p = 30;      // OK:値の変更は可能

まとめ

宣言ポインタ自体の変更指す先の値の変更
const int*可能不可
int const*可能不可
const int* const不可不可
int* const不可可能

「const が * の左側にあるか右側にあるか」に着目すれば、どの部分が不変になるのかを素早く見抜けるようになります。ぜひ実装の際の参考にしてください。

  1. DirectX11とDirectX12の違いを徹底解説!ゲーマーが知っておくべきポイント

    DirectXは、ソフトウェアがマルチメディアコンテンツを描画し、グラフィックハードウェアと通信するために使用されるAPI(アプリケーションプログラミングインターフェース)のコレクションです。DirectXの主要な構成要素であるDirect3Dは、ソフトウェアとグラフィックスハードウェア間の通信を担っています。ハードウェアは製品ごとに異なるため、標準化された関数や呼び出しのライブラリを通じてグラフィックカードと通信することで、ゲーム開発を大幅にスピードアップできます。これは「ハードウェア抽象化」と呼ばれ、APIの最も重要な役割となっています。車に例えてみましょう。1台の車の運転ができれば、ほぼ

  2. C#の暗黙的型変換と明示的型変換の違いを徹底解説!サンプルコードで学ぶ型変換の基本

    はじめに C#では、異なるデータ型の間で値をやり取りする際に「型変換」が必要になります。型変換には、コンパイラが自動的に行ってくれる暗黙的型変換と、プログラマが意図的に指示する明示的型変換の2種類があります。本記事では、それぞれの特徴と違いをサンプルコードとともにわかりやすく解説します。 暗黙的型変換(Implicit Type Conversion)とは 暗黙的型変換は、C#が型の安全性を保ちながら自動的に実行してくれる変換です。小さい型から大きい型への変換(例:int → long)は、データが失われる恐れがないため、特別な記述をしなくても行えます。 次のコードを見てください。int型の