- ベストアンサー
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のようにすることでの相違点を教えてください。 調べたのですがすっきりいきません。よろしくお願いします。
- みんなの回答 (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について回答して欲しいとのことでしたらごめんなさい。)
その他の回答 (2)
- leaz024
- ベストアンサー率75% (398/526)
1は char型が const なのではなく、p1 自身が const です。 p1 が指しているデータは const ではありません。 2は p2 自身が const である上、指しているデータも const です。 つまり、 *p1 = ch; は問題ありませんが、 *p2 = ch; p1 = &ch; p2 = &ch; は、全てコンパイルエラーとなります。 ※ch は char 型の変数とします。
お礼
理解できていなかった部分が、分かりました。 ありがとうございました。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
p2 はポインタ値を変更することができません。
お礼
返事遅くなりました。どうもありがとうございます。
お礼
例を挙げて教えていただいたので、十分理解することができました。intもわかっていませんでしたが、charで質問していましたm(__)m どうもありがとうございました。