こんにちは､ お帰りなさい｡ もうひとつのチャレンジをご紹介します｡
このチャレンジでは､ ポインタ演算のすべてを学んでほしい｡
ポインタ演算は実に巧妙な概念であることを忘れないでください｡
表記上の概念です｡
しかし､ これは配列とポインタの関係を如実に示している｡
とても簡単な構文で､
コードの行数を減らしながら､ とても簡単に配列をトラバースすることができ､ 本当にすてきなコンセプトです｡
そこで､ ポインタ演算のすべてを学ぶことになる｡
また､ constant modifierについても詳しく説明します｡
そこで､ 今回のチャレンジでは､ ポインタ演算とconst修飾子の理解度を問うプログラムを書いていただきたいと思います｡
この2つの概念については､ これまでの講義で学んできました｡
そこで､ 文字列の長さを計算する関数を書いてほしい｡
この関数は､ 定数charポインタをパラメータとして受け取る必要があります｡
定数charポインタは､ ポインタが指しているものの値を変えることができないということであり､
長さを変えるということはしないことになります｡
この関数は､ ポインタ演算によってのみ文字列の長さを決定することができます｡
str length関数は使わないでほしい｡ ポインタ演算を使ってほしい｡
そして､ 私が想定しているこの関数の実装方法は､ ポインタの末尾のアドレスを取得する､
というものです｡
それは､ 本来はポインターの長さでしょう｡
しかし､ 最後の文字列のアドレスとポインタを取得する方法は､ whileループを書けばいいのです｡
whileループは､ NULLの終端文字まで行くことができます｡
あるいはヌル文字､ これはintで表現されることを覚えておいてください｡
つまり､ ヌルの終端は実際にはゼロである｡ つまり､ whileループを書けば､
whileループの条件に含まれるのは､ ポインタの再参照だけということになります｡
なぜなら､ d参照ポインタの値が0であれば､ ループからジャンプアウトして､
そこがヌル終端となるからです｡
だから､ ポインターを全部見てほしいんです｡
そして､ その間に､ そのポインタをインクリメントし続けるのです｡
これで､ 文字列の終端を指すポインタができましたね｡
そして､ 実際に長さを計算するためには､ 2つのポインタをマイナスすればよいのです｡
渡されたポインタは文字列の先頭を指しており､
次に関数内で作成したポインタは文字列の末尾を指している｡
文字列の始点から文字列ポインタの終点を引くと､
文字列の長さが求まる｡
つまり､ ポインタを1つずつインクリメントして終端アドレスにたどり着き､
それぞれのポインタを減算するポイント演算をすることになるわけです｡
これは､ 引き算にポイント演算を使う方法として､ 実に最も妥当な方法であろう｡
通常､
2つのポインターを追加することはありません｡ なぜなら､ 2つのアドレスを追加する必要があるからです｡
配列の中の2つの要素の距離を知るために2つのアドレスを引くことはできますが､
足し算は意味をなしません｡
つまり､
もう一度言いますが､ この関数はポイント演算で文字列の長さを決定するしかないのです｡
関数内でローカルポインタを作成し､ そのポインタを毎回インクリメントして､
NULLターミネータが表示されるまで終了させる､ 単純なwhileループです｡
そして､ 終端アドレスと始端アドレスが決まったら､ その2つのポインタを差し引けば､
長さがわかるというわけです｡
その長さを関数からint型として返す必要があります｡
そして､ 実際の長さそのものをプリントアウトすればいいのです｡
この課題では､ ポイント演算に慣れることと､ ポインタの指す実際の値を変えたくないので定数修飾子を使う方法､ 2つのポインタの引き算､
さらにポインタの値自体を見てヌル文字を判断するwhileループを使う方法を学びます｡
頑張ってください｡
次回の講義で解決策を提示します｡ ありがとうございます｡