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

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
  1. 【C/C++】const int*、const int* const、int const* の違いをわかりやすく解説

    C言語やC++では、ポインタとconst修飾子の組み合わせ方によって、複数の異なる変数宣言が存在します。「const int*」「const int* const」「int const*」など、一見よく似たこれらの宣言の違いを正確に理解することは、安全でバグの少ないコードを書くうえで非常に重要です。本記事では、これら3つの宣言の違いを、複雑な宣言を読み解く際に役立つ「時計回り/らせんルール(Clockwise/Spiral Rule)」にも触れながら、コード例とともに分かりやすく解説します。時計回り/らせんルールとは宣言の中心にある識別子から出発し、時計回りに記号をなぞっていくことで、cons

  2. GoとJavaの違いを徹底比較!特徴と使い分けのポイント

    プログラミング言語を選ぶ際、「Go」と「Java」のどちらを採用すべきか迷う開発者は少なくありません。どちらもGoogleや企業システムで広く使われる人気言語ですが、設計思想や言語仕様には大きな違いがあります。本記事では、それぞれの言語の特徴を解説したうえで、両者の主な違いを比較表を使ってわかりやすく整理します。 GoとはGoはGoogleが開発した手続き型(プロシージャル)プログラミング言語です。プログラムはパッケージ単位で構成され、シンプルで読みやすいコード記述を重視した設計になっています。動的言語に近い柔軟なパターンを取り入れつつ、静的型付けによる安全性も兼ね備えています。また、軽量スレ