薄いブログ

技術の雑多なことを書く場所

アドレスから添字を求めるのがめんどくさい

どうも、@orisanoです。

今日は、bsearchという関数を使ってて思ったのですが、
ポインタから添字を求めるのってちょっとだけめんどくさいなって思いました。
ので、ソースコードを書いて、忘備録的にあげようかなと思った次第です。
以下コード

typedef unsigned long long ulong;
ulong ptr2index(void *head, void *cur, size_t size)
{
	ulong ha = (ulong)head;
	ulong ca = (ulong)cur;

	if (ca < ha) ha ^= ca ^= ha ^= ca;
	return ((ca - ha) / size);
}

追記: どの処理系でもできるか保証できないですが

int ary[1024];
int *p = ary;
int *q = ary + 54;
int d;

d = q - p;

という感じでやっても添字は求まるっぽいです。(詳しくは調べてないです

処理系によってアドレスが64bitだったりするので、最初からlong longにしておけば32bitの処理系でも大丈夫なんじゃないかっていう甘えです。