1. ホーム
  2. c++

[解決済み] const int*、const int * const、int const *の違いは何ですか?

2022-03-14 07:09:32

質問

の使い方をいつも間違えてしまいます。 const int* , const int * const および int const * を正しく理解することです。できること、できないことを定義したルールはありますか?

代入や関数への受け渡しなど、やっていいことと悪いことを全て知りたいです。

どのように解決するのですか?

逆から読むと(駆動するように 時計回り/スパイラルルール ):

  • int* - intへのポインタ
  • int const * - const int へのポインタ
  • int * const - int への const ポインタ
  • int const * const - const int への const ポインタ

では、最初の const はどちらのタイプでも良いので。

  • const int * == int const *
  • const int * const == int const * const

本当にクレイジーになりたいなら、こんなこともできます。

  • int ** - intへのポインタへのポインタ
  • int ** const - int へのポインタへの const ポインタ
  • int * const * - int への const ポインタへのポインタ
  • int const ** - const int へのポインタへのポインタ
  • int * const * const - intへのconstポインタ
  • ...

そして、その意味を明確にするために const :

int a = 5, b = 10, c = 15;

const int* foo;     // pointer to constant int.
foo = &a;           // assignment to where foo points to.

/* dummy statement*/
*foo = 6;           // the value of a can´t get changed through the pointer.

foo = &b;           // the pointer foo can be changed.



int *const bar = &c;  // constant pointer to int 
                      // note, you actually need to set the pointer 
                      // here because you can't change it later ;)

*bar = 16;            // the value of c can be changed through the pointer.    

/* dummy statement*/
bar = &a;             // not possible because bar is a constant pointer.           

foo は定数整数への変数ポインタです。これにより、指し示すものを変更することはできますが、指し示す値を変更することはできません。これはC言語の文字列でよく見られます。 const char . どの文字列を指しているかを変更することはできても、その内容を変更することはできません。これは、文字列そのものがプログラムのデータセグメントにあり、変更されるべきではない場合に重要です。

bar は、変更可能な値への定数または固定ポインタです。これは、余分な構文上の糖分を含まない参照と同じです。このため、通常であれば参照を使うところを T* const を許可する必要がある場合を除き、ポインタの NULL のポインタを使用します。