C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。
C言語のポインタに const をつけると分かりにくくなります。
例えばこの4つ。
const int *p;
int const *p;
int *const p;
const int *const p;見た目は似ていますが、意味はすべて違います。
この記事ではポインタconstの違いを分かりやすく解説します。
constの基本的な使い方についてはこちらの記事で解説しています。
基本的なポインタの使い方についてはこちらの記事で解説しています。
ポインタconstは3種類ある
まずは結論。
| 書き方 | 意味 |
|---|---|
| const int *p int const *p | 中身を変更できない |
| int *const p | アドレスを変更できない |
| const int *const p | 両方変更できない |
これを順番に説明します。
初心者さんconstって前につけるんじゃないんですか?



ポインタだと後ろにもつける



え、それ意味変わるんですか?



めちゃくちゃ変わるよ
const int *p(中身を変更できない)
const int *p;これは
「ポインタの先の値を変更できない」
という意味です。
例
int a = 10;
const int *p = &a;
*p = 20; // エラーこれはNGです。
なぜなら
「const int」
だからです。
でもアドレスは変更できます。
int a = 10;
int b = 20;
const int *p = &a;
p = &b; // OKまとめ
| 操作 | 結果 |
|---|---|
| *p = 変更 | NG |
| p = 別アドレス | OK |
メモリの視点での配列とポインタの違いはこちらの記事で解説しています。
int *const p(アドレス変更できない)
int *const p;これは
「ポインタ自体がconst」
という意味です。
例
int a = 10;
int b = 20;
int *const p = &a;
p = &b; // エラーアドレス変更はできません。
でも中身は変更できます。
*p = 100; // OKまとめ
| 操作 | 結果 |
|---|---|
| *p = 変更 | OK |
| p = 別アドレス | NG |
const int *const p(両方変更不可)
const int *const p = &a;これは
・値変更不可
・アドレス変更不可
両方禁止です。
*p = 10; // エラー
p = &b; // エラー完全に読み取り専用になります。
const int * と int const * は同じ
この2つ
const int *p;
int const *p;意味は同じです。
const は左側にかかるからです。
つまり
const intと
int constは同じ意味です。
覚え方(重要)
const は「左側を修飾する」
これが基本です。
const int *p;const → int を修飾
つまり
「intが変更不可」
int *const p;const → *p を修飾
つまり
「ポインタが変更不可」
さらに分かりやすい読み方
右から読むと分かりやすいです。
const int *p;p は
→ int へのポインタ
→ const
つまり
「const int へのポインタ」
int *const p;p は
→ const
→ int へのポインタ
つまり
「変更できないポインタ」
よくある実務コード
配列を受け取る関数
void print(const int *data)これは
「データを書き換えません」
という意味です。
安全な関数になります。
constポインタが重要な理由
constをつけると
① バグ防止
② 意図が明確
③ 最適化される
特に組み込みでは重要です。
まとめ
| 書き方 | 意味 |
|---|---|
| const int *p | 値変更不可 |
| int *const p | アドレス変更不可 |
| const int *const p | 両方不可 |
ポインタconstは
constがどこに付くかを見る
これだけ覚えればOKです。
この記事が参考になった方へ
C言語の基本文法を一覧で整理しています。
技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント