2011-07-14 24 views
6

我無法理解Python ctypes中LP_ *(例如LP_c_char)和* _p(例如c_char_p)指針之間的區別。有文件區分它們嗎?ctypes中LP_ *指針和* _p指針有什麼區別? (和奇怪的與結構的交互)

我讀過關於* _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'> 

換句話說,指針已經在過程的某個地方被取消引用。

回答

9

http://docs.python.org/library/ctypes.html#ctypes.c_char_p

表示與c的char *數據類型時,它指向一個零終止的字符串。對於也可指向二進制數據的通用字符指針,必須使用POINTER(c_char)。因爲它假設你指的是一個字符串,它通常是當你使用char *在C. LP_c_char沒有這樣的假設的情況下

c_char_p被映射到Python的str類型。

基本的數據類型,當爲外函數調用返回的結果,或者,例如,通過檢索結構字段成員或陣列的物品,被透明地轉換爲本機Python類型。換句話說,如果一個外部函數有一個c_char_p的類型,你總是會收到一個Python字符串,而不是一個c_char_p實例。