ポインタの引き算

すっかり忘れていたのでメモ。


ポインタ同士の引き算はアドレスの差分にはなりません。
日本語で言いにくいが、「該当する型が2つのポインタの間にある数」が返ってくる。

(例)

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        int *area;
        int *pt1, *pt2;

        area = (int *)malloc(sizeof(int) * 64);
        if (!area) {
                perror("alloc area");
                return -1;
        }

        pt1 = &area[0];
        pt2 = &area[10];

        // 差分がわかりやすいように10進数で出力
        printf("pt1: %lu, pt2: %lu\n", (unsigned long)pt1, (unsigned long)pt2);
        printf("pt2 - pt1 = %lu\n", pt2 - pt1);
        printf("(ulong)pt2 - (ulong)pt1 = %lu\n", 
               (unsigned long)pt2 - (unsigned long)pt1);

        return 0;
}


上のプログラムの実行結果はこうなる

pt1: 26071056, pt2: 26071096
pt2 - pt1 = 10
(ulong)pt2 - (ulong)pt1 = 40


pt1の値が26071056、pt2の値が26071096だから、単純に引き算するとpt2 - pt1 = 26071096 - 26071056 = 40となる。
つまり40byteはなれてるぞとなる。
でも実際にプログラムではp2 - p1 = 10となる。
これの意味はp1からp2までには、int型の変数が10個あるって考えればおけ。
配列の番号みたいなもんです。


ちなみにキャストして引き算をやればちゃんと40と言う結果が返る。




いやあ、すっかり忘れててちょっと混乱した。