C言語 ポインタのconstとは?constの位置による違いを完全解説

目次

C言語文法解説シリーズ

本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説します。

👉 C言語文法解説シリーズ一覧はこちら

C言語のポインタに const をつけると分かりにくくなります。

例えばこの4つ。

C
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(中身を変更できない)

C
const int *p;

これは

「ポインタの先の値を変更できない」

という意味です。

C
int a = 10;
const int *p = &a;

*p = 20;   // エラー

これはNGです。

なぜなら

「const int」

だからです。

でもアドレスは変更できます。

C
int a = 10;
int b = 20;

const int *p = &a;
p = &b;   // OK

まとめ

操作結果
*p = 変更NG
p = 別アドレスOK

メモリの視点での配列とポインタの違いはこちらの記事で解説しています。

int *const p(アドレス変更できない)

C
int *const p;

これは

「ポインタ自体がconst」

という意味です。

C
int a = 10;
int b = 20;

int *const p = &a;
p = &b;   // エラー

アドレス変更はできません。

でも中身は変更できます。

C
*p = 100;   // OK

まとめ

操作結果
*p = 変更OK
p = 別アドレスNG

const int *const p(両方変更不可)

C
const int *const p = &a;

これは

・値変更不可
・アドレス変更不可

両方禁止です。

C
*p = 10;   // エラー
p = &b;    // エラー

完全に読み取り専用になります。


const int * と int const * は同じ

この2つ

C
const int *p;
int const *p;

意味は同じです。

const は左側にかかるからです。

つまり

C
const int

C
int const

は同じ意味です。


覚え方(重要)

const は「左側を修飾する」

これが基本です。

C
const int *p;

const → int を修飾

つまり

「intが変更不可」

C
int *const p;

const → *p を修飾

つまり

「ポインタが変更不可」


さらに分かりやすい読み方

右から読むと分かりやすいです。

C
const int *p;

p は
→ int へのポインタ
→ const

つまり

「const int へのポインタ」

C
int *const p;

p は
→ const
→ int へのポインタ

つまり

「変更できないポインタ」


よくある実務コード

配列を受け取る関数

C
void print(const int *data)

これは

「データを書き換えません」

という意味です。

安全な関数になります。

関数ポインタについてはこちらの記事で解説しています。


constポインタが重要な理由

constをつけると

① バグ防止
② 意図が明確
③ 最適化される

特に組み込みでは重要です。


まとめ

書き方意味
const int *p値変更不可
int *const pアドレス変更不可
const int *const p両方不可

ポインタconstは

constがどこに付くかを見る

これだけ覚えればOKです。

この記事が参考になった方へ

C言語の基本文法を一覧で整理しています。

👉 C言語文法解説シリーズ一覧はこちら

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする


目次