こんにちは､ そしてお帰りなさい｡
点演算は､ 理解し把握するのが難しい概念なので､ この概念を実際に示す最後の例として､
良い仕事をしてくれるものを紹介したいと思います｡
そして､ この例を理解すれば､ ポイント演算は問題ないでしょう｡
そこで､ 最初に紹介するのは､ ポインタに整数値を追加した場合の効果です｡
そこで､ 足し算でポインタ演算を行うと､ 実際にアドレスでその動作を確認することができます｡
このプログラムでは､ 文字列を作成しています｡
文字列は文字配列と呼ばれます｡
そして､ pという文字ポインタを作っています｡
複数ある文字列の全長を全て調べています｡
だから､ 配列全体を調べているんです｡
複数のサイズと複数のループの強さと長さのための基本的な名前だけです｡
そして､ その配列の中にある実際の文字列や文字をそれぞれプリントアウトしているのです｡
また､ 住所と､ それに加えた実際の番号を表示させています｡
では､ この出力を見てみましょう｡ この出力は､ ポイント演算の実に良い例を示しています｡
では､ コードブロックに移動して､ これを実行してみましょう｡
そこで､ コードブロックの中に入っています｡ コードを少しきれいにしました｡
余分なincludeなので､ str length､ set a strn lengthを使用しています｡
そして､ これだけを実行したいのです｡
これを実行すると､ メモリがどのように見えるかを記憶し､ ポイント演算を行う値が表示されることに気がつくでしょう｡
つまり､
multiple sub-0と言った場合､ multipleは文字列を含むだけだと覚えておいてください｡
しかし､ この配列の中身を見ると､ 0の倍数はa､
1の倍数はスペース､ そして残りは文字列となっています｡
それがアレイです｡
このすぐ隣にあるのは､ ポインタに0を加えてデリファレンスし､
1を加えて2を加えるのと同じです｡
そして､ ポインタそのものをデリファレンスして､ それに数値を足すことで､
ポインタ演算を行う方法を示しています｡
つまり､ ポインタ＋7回の再参照でgになるわけです｡
そして､ 3つ目のコラムは､ 実際のアドレスをインクリメントしながら表示しています｡
そこで､
文字配列にだけアンパサンドを使って配列の各要素のアドレスを表示すると､
要素0には060feffというアドレスが表示され､ 以下同様です｡
そして､ デリファレンスせずにポインタそのものに追加した場合のアドレスを見てみると､
アドレスが並んでいるのがわかると思います｡
最初に表示されるのは配列のインデックスで､
これは単なるカウンターです｡
そして､ 配列のところの文字であるパーセントcを表示します｡
次に表示しているのは､ ポインタにIを加えたものをデリファレンスしています｡
つまり､ ここではIを表示し､ ポインタの再参照と実際の値であるIを表示しているのです｡
そこで､ dには実際のカウンタを表示し､ cにはデリファレンスを表示することにしました｡
つまり､ pはポインターです｡
pプラスIというポインタ演算をして､ それをデリファレンスしているだけなのです｡
そして､ 配列のアドレスを取得するために必要なのは､
アンパサンドマルチプル､ そしてインデックスと言うだけです｡
最初のポインタのアドレスを得るには､ pプラスIと言えばよいのです｡
実際のカウンタを得るには､
pをどのようにインクリメントしているかを示すために､ pプラスパーセントdと言えばよいのです｡
しかし､ アドレスを指しているメモリが実際に表示されるさまざまな方法と､
配列のさまざまなインデックスと実際のポインタに相当することを示すには､
良い仕事だと思います｡
これはいい仕事をしていると思いました｡
もう一つ､ Longを使ったポインタの演算について､ 良い仕事をしている例を見てみたいと思います｡
なぜなら､
ここではこれらは整数だからです｡ だから､ 1つ足すだけで､ 次のバイトまで自動的に上がっていくんです｡
私たちがやっていることを見てみましょう､ ロングをやっているんです｡
そこで､ この例では､ ロングとロングポインタで同じことができることを示したいと思います｡
文字ポインタの場合は､ 単なる文字列の文字配列でした｡
しかし､ サイズが異なる長い配列でも､ ポインタを使って反復処理すれば､
実際にバイト数がどのように変化するかがわかります｡
つまり､ longポインタを1つ追加すると言っても､ 実際には4バイトを追加しているのです｡
longは少し大きいので､ この例でそれを見てみましょう｡
では次に､ この例をコードブロック単位で実行してみましょう｡
では､ その例をご紹介しましょう｡ ここでも､ 整数カウンタ､ ループカウンタがあります｡
ロングアレイ15Lを用意しました｡
サフィックスを付けてlを指定し､ そのlとlongを指定し､
ロングポインタで複数を指しているのです｡
繰り返しになりますが､ 配列なので演算子のアドレスは不要です｡
ロングを貫き通す｡ ここでは､ stir length は使用できず､ size
of を使用する必要があり､ 実際には配列の各スポットで割り算する必要があります｡
つまり､ 合計サイズを配列の1つのスポットで割ったものが､
4バイトずつ増えていくアドレスを記憶していることになるので､
この時点でジャンプしたいのです｡
ここでやっていることは､ ポインタと配列の両方を表示し､
それらがどのように関連しているかを示すことです｡
そして､ システム上のlongが持つ実際の総バイト数を表示しています｡
このように､ 配列とポインタがどのように関係しているのかがよくわかります｡
ですから､ これを実行すると､ 同じような出力が得られることになります｡
しかし､
ここで少し違うのは､ アドレスの大きさが4バイト増えていることです｡ そこで､ アドレスとポインタをプリントアウトすることにします｡
つまり､ アドレスとポインタに0を足すと､
配列のサブ0（アドレス6356728）に相当することになります｡
そして､ そのポインタをデリファレンスすると､ 15という値が得られます｡
だから､ pプラス0は､ やはり配列のサブ0に等しくなる｡
さらに､ p+1､ p+2､ p+3についても同様に､ インデックスに対応する配列の正しい位置に配置します｡
アドレスは4バイト増えていますが､ それでも2と3を1つずつ足すだけで､
値が同じであることがわかります｡
そして､ このlongは4バイトを占有するので､ アドレスが4つ増えるのだと教えてくれます｡
ここで重要なのは､ これに1を加えても､ コンパイラは次のアドレスに行くことがわかるということです｡
つまり､ longであろうとcharacterであろうと､
あるいはシステム内の特定のデータ型であろうと､ 1か2を足せば正しいバイト数が追加されるのです｡
なぜなら､ このポインタ演算は本当に重要で､
配列を反復したり走査したりするときに本当に役に立つからです｡
というわけで､ お役に立てたでしょうか｡ ありがとうございます｡