ソフトウェアエンジニア現役続行

雑多なことを綴ります

ポインタ同士の加算、減算

プログラミング言語Cを読了しました。C言語の基礎を学ぶ、復習するにはとても良い本です。特にmallocをはじめとする標準ライブラリ関数の内部実装を知ることが出来たのは、今後の開発で役立ちそうです。説明の分かりにくさはあるのですが、この分かりにくい説明とソースコードで言いたいことが理解できるようになることは、他の開発者とコミュニケーションをとったり、他人のソースコードを理解する上で必要です。

演習問題まで丁寧に解いていったので、1ヵ月半かかりました。ここで学んだことを少しずつ記していきたいと思います。

さて、ポインタ同士の演算で許されているのは、

(1) ポインタ同士の減算
(2) ポインタ同士の関係演算子による比較

のみです。

(1)は「ptr1 - ptr2」とすることで、そのアドレス間の要素数を知るときに使います。
(2)は「ptr1 > ptr2」(アドレスの前後関係) や「ptr1 == ptr2」(アドレス値の等価) を知るときに使います。

ポインタ同士の加算、乗除算はすることが禁止されています。なので、真ん中の要素を取得するには、以下のような工夫を必要があります。

char str[10] = "abcdefghij";
char *head = str;
char *tail = &str[9];
char *mid;

mid = low + (high - low) / 2;  /* これはOK */
/* mid = ( low + high) / 2; これはNG */

プログラミング言語Cには演習問題がありません。解答例を知りたい場合は別途販売されているプログラミング言語Cアンサー・ブックを買うか、演習問題の解答例を公開しているサイトを探すと良いでしょう。