• ベストアンサー

C言語について、constの使用方法を教えてください。

C言語の初心者です。 constの仕様について教えてください。 1.char *const p1; 2.const char *const p2; 以上のうような、指定され方があるとします。 p1,p2では何が違うのでしょうか? 1.では、char型がconst 2.では、p2はconst char型を示すポインタがconst というのまでは理解できたのですが、この結果、p1とp2は何が異なるのでしょうか。 p1,p2はconstされていると思いますが、p2のようにすることでの相違点を教えてください。 調べたのですがすっきりいきません。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kary
  • ベストアンサー率55% (10/18)
回答No.3

constについての質問ですが、int型で考えたほうが判りやすいのではないでしょうか。 constはそれの前にある型を読み取り専用にします。例えば、 int A = 1; int B = 2; int * const P1 = &A; とした場合、constになるのは*ですので、P1が指すアドレスを変えることができません。この場合、P1はAのアドレスを指していますが、これを、 P1 = &B; のように、Bのアドレスに変更することができなくなります。ただし、intはconstではないので、 *P1 = 3; とすることはできます。この場合は、Aに3が格納されます。 次に、P1を int const * P1 = A; とした場合、constになるのはintですので、P1が指すアドレスに格納させているint型の値を変更できなくなります。なので、 *P1 = 3; とはできません。逆に、 P1 = &B; のように、P1が指しているアドレスをAのアドレスからBのアドレスに変えることはできます。 int const * const P1 = &A; との宣言では、intと*をconstにしますので、アドレス自体も、アドレスに格納されている値も変更できません。また、constを一番最初に書いた場合のみそれの次の型をconstにします。なので、 const int C; int const C; は、同じ意味です。 charの場合は配列とポインタを両方同時に考えなければならないので、混乱してしまうかも知れませんが、基本的にはintの場合と同じです。 判りにくい説明ですが、多少でもお役に立てれば良いのですが...。(それと、intの場合は判っているからcharについて回答して欲しいとのことでしたらごめんなさい。)

2002hare
質問者

お礼

例を挙げて教えていただいたので、十分理解することができました。intもわかっていませんでしたが、charで質問していましたm(__)m どうもありがとうございました。

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

1は char型が const なのではなく、p1 自身が const です。 p1 が指しているデータは const ではありません。 2は p2 自身が const である上、指しているデータも const です。 つまり、   *p1 = ch; は問題ありませんが、   *p2 = ch;   p1 = &ch;   p2 = &ch; は、全てコンパイルエラーとなります。 ※ch は char 型の変数とします。

2002hare
質問者

お礼

理解できていなかった部分が、分かりました。 ありがとうございました。

回答No.1

p2 はポインタ値を変更することができません。

2002hare
質問者

お礼

返事遅くなりました。どうもありがとうございます。