Мне трудно понять разницу между указателями LP_ * (например, LP_c_char) и * _p (например, c_char_p) в ctypes Python. Есть ли в документации их различение?
То немногое, что я читал об указателях * _p, говорит о том, что они лучше (каким-то неопределенным образом), но когда я пытаюсь использовать их в качестве полей структуры, я получаю странное поведение. Например, я могу создать структуру с полем указателя LP_c_char:
import ctypes
char = ctypes.c_char('a')
class LP_Struct(ctypes.Structure):
_fields_ = [('ptr', ctypes.POINTER(ctypes.c_char))]
struct = LP_Struct(ctypes.pointer(char))
print type(struct.ptr)
И результирующий указатель:
<class 'ctypes.LP_c_char'>
Но когда я создаю структуру с полем указателя c_char_p:
class Struct_p(ctypes.Structure):
_fields_ = [('ptr', ctypes.c_char_p)]
p = ctypes.pointer(char)
struct = Struct_p(ctypes.cast(p, ctypes.c_char_p))
print type(struct.ptr)
результирующее поле «ptr» будет
<type 'str'>
] Другими словами, указатель был разыменован где-то в процессе.