C言語の const int*・int const*・const int* const の違いをわかりやすく解説
ポインタとは
C言語において、*p はポインタが指し示す先に格納された値を表し、p はその値が格納されているアドレス(メモリ上の場所)を表します。このアドレスを保持する変数のことを「ポインタ」と呼びます。
const int* と int const*
const int* と int const* はまったく同じ意味であり、どちらも「定数intへのポインタ」を表します。このポインタが指し示す先のint型の値は変更できませんが、ポインタ自体は定数ではないため、別の定数intを指すように後から変更することが可能です。
const int* const
const int* const は「定数intへの定数ポインタ」を表します。ポインタが指す先の値は変更できないうえに、ポインタ自体も定数となるため、別の変数を指すように変更することも一切できません。
違いの比較一覧
| 宣言 | 指す先の値の変更 | ポインタ自体の変更 |
|---|---|---|
| const int* / int const* | 不可 | 可 |
| const int* const | 不可 | 不可 |
読み方のコツ:右から左へ
宣言構文を読み解くときの鉄則は、「右から左へ」読むことです。
// 定数intへの定数ポインタ const int * const // 定数intへのポインタ const int *
サンプルコード(C)
コメントアウトされている誤ったコードのコメントを外してコンパイルすると、実際にエラーを確認できます。
#include <stdio.h>
int main() {
// 例:int const*
// 注意:int const* は const int* と同じ意味
const int p = 5;
// q は定数intへのポインタ
int const* q = &p;
// 不正な代入
// p の値は変更できない
// エラー:assignment of read-only location '*q'
//*q = 7;
const int r = 7;
// q は別の定数intを指すことができる
q = &r;
printf("%d", *q);
// 例:int const* const
int const* const s = &p;
// 不正な代入
// s が指す先の値は変更できない
// エラー:assignment of read-only location '*s'
// *s = 7;
// 不正な代入
// s 自体も変更できない
// エラー:assignment of read-only variable 's'
// s = &r;
return 0;
}実行結果
7
-
【C/C++】const int*、const int* const、int const* の違いをわかりやすく解説
C言語やC++では、ポインタとconst修飾子の組み合わせ方によって、複数の異なる変数宣言が存在します。「const int*」「const int* const」「int const*」など、一見よく似たこれらの宣言の違いを正確に理解することは、安全でバグの少ないコードを書くうえで非常に重要です。本記事では、これら3つの宣言の違いを、複雑な宣言を読み解く際に役立つ「時計回り/らせんルール(Clockwise/Spiral Rule)」にも触れながら、コード例とともに分かりやすく解説します。時計回り/らせんルールとは宣言の中心にある識別子から出発し、時計回りに記号をなぞっていくことで、cons
-
GoとJavaの違いを徹底比較!特徴と使い分けのポイント
プログラミング言語を選ぶ際、「Go」と「Java」のどちらを採用すべきか迷う開発者は少なくありません。どちらもGoogleや企業システムで広く使われる人気言語ですが、設計思想や言語仕様には大きな違いがあります。本記事では、それぞれの言語の特徴を解説したうえで、両者の主な違いを比較表を使ってわかりやすく整理します。 GoとはGoはGoogleが開発した手続き型(プロシージャル)プログラミング言語です。プログラムはパッケージ単位で構成され、シンプルで読みやすいコード記述を重視した設計になっています。動的言語に近い柔軟なパターンを取り入れつつ、静的型付けによる安全性も兼ね備えています。また、軽量スレ