こんにちは､ そしてお帰りなさい｡
この講義では､ const 修飾子について､ ポインタでの使い方を説明したいと思います｡
これまでの講義で一定のことを学んできた｡
ただ､ 変数の値を変更することはできないということです｡ しかし､ それをポインターに当てはめるとどうなるのだろうか｡
つまり､ 変数や配列にconst修飾子を使うと､ その変数配列の内容がプログラムによって変更されないことをコンパイラに伝えることができるのです｡
プリプロセッサでdefine文を作るという方法もありますが､
通常はconstの方が効率的で良い方法です｡
ポインターの場合､ const修飾子を使うときには､ 2つのことを考慮しなければなりません｡
実は､ ポインターは変えられないということなのでしょうか？
それとも､ ポインタが指す値は変更できないと言っているのでしょうか？
なぜなら､ ポインタはアドレスの値を含んでいることを思い出してください｡
そして､ そのアドレスは一生変えたくないかもしれません｡
あるいは､ ポイントが指し示す値を変えたくない場合もあります｡
いずれの場合も､ 構文を具体的に説明する必要があります｡
そこで､ ポインタを宣言する際にconstキーワードを使用することで､ 指し示す値を変更してはならないことを示すことができます｡
これを提供する方法と､ 再びそうポインタは､
値がアドレスを持っているように値である｡
指し示すのは､ そのアドレスの値です｡
それを変更させないようにしたい場合は､
次のようにします｡
ポインターを宣言するときに､ 型の前に定数修飾子のアスタリスクを付けると言うことでしょう｡
つまり､ ポインタの型が何であれ､ アスタリスクポインタを定数として指定することになります｡
つまり､ これは実際には定数へのポインタを定義するデフォルメです｡
999lを変更することはできません｡
そこで､ pvalueが指す値は一定であることを宣言する｡
コンパイラは､ pvalueが指す値を変更しようとする文がないかどうかをチェックします｡
そして､ もしプログラム中にそのようなバディがいたら､ エラーを投げることになる｡
これが構文なんですね｡ ここでも注目したいのは､ constが最初の単語であり､
typeの前にあることです｡
つまり､
指し示す値が変わることはありえないということですね｡
つまり､ pvalueでこのようなことをしようとすると､ そこにインダイレクト演算子があるので､
指し示すものに値を代入しようとするわけです｡
つまり､
指し示すものに値を代入しているのです｡ もしこれを実行しようとすると､
その値を変更することができないので､
エラーが発生します｡
では次に､ 定数へのポインタについてはどうでしょう｡
そして､ 先の宣言で､ ポイントが指すポインタは変更できないように作成しました｡
しかし､ 宣言した変数の実際の値を変更することは可能です｡
だから､ ロングバリューを変更することはできるだろう｡
星のp値を変更することはできません｡
しかし､ long valueは定数として定義されているわけではなく､ 単にlong valueとして定義されています｡
つまり､ 定数が適用されていなかったので､ 整数ポインタの値を変更することができます｡
ポインターにのみ定数を適用しています｡ だから､ 価値は777Lに等しいと言える｡
指された値が変更されましたが､ ポインタを使用して変更したわけではありません｡
また､ ポインタ自体も定数ではありません｡
ポインターはアドレスを記憶している｡
ポインタを定数にする宣言をしていない｡ だから､ まだ変えることができるんです｡
ポインタが指しているものが一定であることを確認します｡ numberという新しい変数を宣言すれば､ p-valueはその数値のアドレスに等しいと言うことができる｡
ポインタの値のアドレスを変えているのだから､ 全く問題ない｡
ポインタが指していたものの値を変えているわけではないのです｡
つまり､ 単なるアドレスであるポインタの値を変更するか､
ポインタが指し示すものを変更するか､
この区別を理解することです｡
ポインタが指しているものを変更したくない場合は､
ポインタ自体の宣言で､ constをその最初のキーワードにしなければならない｡
そこで､ この例でも､ p-valueに格納されているアドレスを変更して､ 数値を指すようにします｡
我々はまだ､ 我々はその値を変更することはできませんとして宣言されたので､ 格納されている値を変更するには､
ポインタを使用することはできません｡
ポインタに格納されているアドレスは､ 私たちがやったようにいくらでも変更できます｡
ポインタに格納されているアドレスを変更した後でも､ ポインタを使用して指し示す値を変更することはできません｡
つまり､ long numberに変えただけなのに､
ポインタはキーワードとしてconstantを持ったままだったのです｡
だから､ ポインタが何を指していても､ 値を変えることはできない｡
ポインタのアドレスが変わることを許さないのはどうなんだ､
ポインタの中に入っている値だ｡
そのため､ ポインタに格納されているアドレスが変更できないようにすることも必要でしょう｡
ポインタの宣言で定数キーワードを使えば同じようにできるのですが､
ちょっと違うんです｡
constを最初のキーワードにするのではなく､
データ型の後､ アスタリスクの後に置くのです｡
これは､ ポインタ自身はその値を変えることができないと言っているのです｡
intの前に置くと､ ポインタが指す値は変更できないと言っていることになります｡
そうすることで､ ポインタが常に同じものを指すようになるわけです｡
アドレスが変更されることはありません｡
コンパイラは､ コード内の他の場所でポインタを変更しようとすると､
反転しないかどうかをチェックします｡
このアドレスは変更できません｡
ですから､ p count equals and item と言おうとしても､ エラーになります｡
なぜなら､ それはカウントアドレスしか指し示すことができないからです｡
変わりたいと思ったら､ 不変のキーワードをどこに置くかが重要なんです｡
ポインターのアドレスを変更させたくない場合､ またはポインターのアドレスを変更させない場合｡
最初のキーワードのような定数は､ ポインタの指す値を変更することができません｡
星のデータ型の後に定数を入れると､ それはポインタのアドレスが変更できないと言っていることになります｡
だから､ 今言ったことを勉強してください｡
その構文を理解することは､ とても重要で､ とても厄介なことなのです｡
それは非常に簡単にそのミスをすることができます｡
だから､ その違いを理解すること｡
先ほどと同じように､ p countを使ってp
countが指し示す値を変更することも可能です｡ なぜなら､ pカウントは､ たとえ新しいアドレスを割り当てられないとしても､
指し示す値を変更することができるからです｡
だから､ 参照を解除して､ そのように変更することができるのです｡ star p countが345に等しいと言えば､ それでいいんです｡
ポインタを介して count に格納された値を参照し､ その値を 345 に変更する｡
同じく定数である値を指す定数ポインタを作ることができるので､
定数in star､ 定数p itemのようなことができる｡
そしてそれは､ 値が指し示すものが定数であり､ ポインタそのものが定数であると言っているのです｡
つまり､ p項目は定数へのポインタなので､ すべてが固定されているのです｡
p itemに格納されているアドレスを変更することはできませんし､ p itemを使ってp
itemが指すものを変更することもできません｡
しかし､ それでも項目を変更することは可能です｡
アイテムは定数ではないので､ アイテムを変更することも可能です｡
値を直接変更することができます｡
もし､ 何も変更されていないことを確認したい場合は､ 実際にitem
int変数も定数として作成する必要があります｡
そうすると､ 絶対に変わらないということになりますね｡
しかし､ ここで定数ポインタとポインタが指す定数値との違いを覚えておいてください｡
両方使えます｡ どちらかを使うことができます｡
もし､ すべてが一定であることを保証したかったら､
その変数に指しているものも一定であることを確認してください｡ ありがとうございます｡