В чем разница между указателями LP_ * и указателем * _p s в ctypes? (и странное взаимодействие со структурами)

Мне трудно понять разницу между указателями 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'>

] Другими словами, указатель был разыменован где-то в процессе.

8
задан Tony S Yu 14 July 2011 в 16:55
поделиться