銀月の符号

Python 使い見習いの日記・雑記

ctypes メモ、ポインタオブジェクト

2つのポインタの指し示す先が同じものかどうか確認する。本来ならば比較するだけのはず。しかし、これを Python 、 ctypes でどう実現するのかが分からなかった。 Python でつくられたポインタオブジェクトはあくまで Python のオブジェクトであって C のポインタじゃないから。便利さの代償か。

ctypesはOOR (original object return、元のオブジェクトを返すこと)ではないことに注意してください。属性を取り出す度に、新しい同等のオブジェクトを作成していいるのです

http://www.python.jp/doc/release/lib/ctypes-pointers.html
>>> from ctypes import *
>>> a = c_int(1)
>>> b = pointer(a)
>>> c = pointer(a)
>>> b is c # これは当然だが、
False
>>> b == c # 比較してもダメで、
False
>>> b.contents == c.contents # 取り出したものも別物なり…
False

たしかに。ではどうするか。ドキュメント探していくとありました。 Python 関係者のドキュメント作成意欲はすさまじいな。

addressof( obj)
メモリバッファのアドレスを示す整数を返します。objは ctypes型のインスタンスでなければなりません。

http://www.python.jp/doc/release/lib/ctypes-utility-functions.html

つかってみる。

>>> addressof(a)
10822520
>>> addressof(b.contents)
10822520
>>> addressof(c.contents)
10822520
>>> addressof(b)
10822920
>>> addressof(c)
10823000
>>> addressof(b.contents) == addressof(c.contents)
True

OK 。期待通り。