複雜的用法
讓我們將上面的所有例子組合成一個複雜的場景:使用 libc
的 lfind
函式。
有關該功能的更多詳細資訊,請閱讀手冊頁 。我請你在繼續之前閱讀它。
首先,我們將定義適當的原型:
>>> compar_proto = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))
>>> lfind_proto = CFUNCTYPE(c_void_p, c_void_p, c_void_p, POINTER(c_uint), c_uint, compar_proto)
然後,讓我們建立變數:
>>> key = c_int(12)
>>> arr = (c_int * 16)(*range(16))
>>> nmemb = c_uint(16)
現在我們定義比較函式:
>>> def compar(x, y):
return x.contents.value - y.contents.value
請注意,x
和 y
是 POINTER(c_int)
,因此我們需要取消引用它們並獲取它們的值,以便實際比較儲存在記憶體中的值。
現在我們可以把所有東西組合在
>>> lfind = lfind_proto(libc.lfind)
>>> ptr = lfind(byref(key), byref(arr), byref(nmemb), sizeof(c_int), compar_proto(compar))
ptr
是返回的 void 指標。如果在 arr
中找不到 key
,則值為 None
,但在這種情況下,我們得到一個有效值。
現在我們可以轉換它並訪問值:
>>> cast(ptr, POINTER(c_int)).contents
c_long(12)
另外,我們可以看到 ptr
指向 arr
內的正確值:
>>> addressof(arr) + 12 * sizeof(c_int) == ptr
True