ポインタの引き算
すっかり忘れていたのでメモ。
ポインタ同士の引き算はアドレスの差分にはなりません。
日本語で言いにくいが、「該当する型が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と言う結果が返る。
いやあ、すっかり忘れててちょっと混乱した。