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)
http://www.python.jp/doc/release/lib/ctypes-utility-functions.html
メモリバッファのアドレスを示す整数を返します。objは ctypes型のインスタンスでなければなりません。
つかってみる。
>>> 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 。期待通り。