【参考書】新・明解C言語 入門編
【項目】関節演算子と添え字演算 (p277)
C言語の勉強をしておりますが、学習を進めるにあたって「n個の要素へのポインタの有効範囲について」分からないことがあります。
上記の参考書に以下の説明がありました。
(※新・明解C言語 入門編 p277の説明より抜粋)
配列aの要素数がnであれば、配列aを構成する要素はa[0]からa[n-1]までの"n個"です。
ところが
①要素へのポインタとしては&a[0]からa[n]までのn+1個が正しい値として有効という規則があります。
たとえば、配列aはa[0]からa[4]までの5個の要素で構成されるのですが、各要素のポインタ&a[0]...&a[4]に加えて&a[5]も正しいポインタとして有効です。(全部で6個です。)
このような仕様になっているのは配列要素の走査における終了条件(末尾に到達したかどうか)の判定の際に末尾要素の1個後方の要素へのポインタが利用できると便利だからです。
なお、
②&a[6]、&a[7]...がa[4]の2,3..個後方の要素に相当する領域を正しくさせるという保証はありません。
教えていただきたいことは
①要素へのポインタとしては&a[0]からa[n]までのn+1個が正しい値として有効とありますが、n個の要素の1つ後方のポインタを指したとして、それはどういった使い方があるのでしょうか。
ポインタはアドレスを指すので、「n個の要素の1つ後方のポインタ」とはアドレスを指し示しているのだという認識です。
ただ、配列の領域外のアドレスを指したところでそれがどういった条件判定に使用できるのか理解できません。
番兵法というものがあることは理解しています。ただ番兵法とは「探索する値」と全く同じ値を、配列の一番後ろに置く探索の方法のことで、あくまで配列の最後の要素の中の値のことを言っているのであり、アドレスを指しているのではないという認識です。
このほかに、n個の要素の1つ後方のポインタを指すことで得られる方法があるのでしょうか。
②「&a[6]、&a[7]...がa[4]の2,3..個後方の要素に相当する領域を正しくさせるという保証はありません。」とありますが、正しくさせないかもしれないとはどういうことでしょうか。
配列の領域外でも、例えばインクリメントしていけば配列の型の大きさ分、アドレスが進んでいくように思うのですが、認識が誤っているのでしょうか。(上記説明の内容では、n個の配列のn+1個分の後方は正しくインクリメントされない可能性もあると読めてしまいます。)
①と②の疑問について、私一人だけだと限界がありますので、ご存知の方いらっしゃいましたら何卒ご教示いただけないでしょうか。
よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/02 16:33
2019/08/02 23:39