14.14.1.4 基本のデータ型

ctypesはたくさんのCと互換性のあるデータ型を定義しています :

ctypesの型 Cの型 Pythonの型
c_char char 1文字の 文字列
c_wchar wchar_t 1文字の ユニコード文字列
c_byte char 整数/長整数
c_ubyte unsigned char 整数/長整数
c_short short 整数/長整数
c_ushort unsigned short 整数/長整数
c_int int 整数/長整数
c_uint unsigned int 整数/長整数
c_long long 整数/長整数
c_ulong unsigned long 整数/長整数
c_longlong __int64 or long long 整数/長整数
c_ulonglong unsigned __int64 or unsigned long long 整数/長整数
c_float float 浮動小数点数
c_double double 浮動小数点数
c_char_p char * (NUL 終端) 文字列または None
c_wchar_p wchar_t * (NUL 終端) ユニコードまたは None
c_void_p void * 整数/長整数 またはNone

これら全ての型はその型を呼び出すことによって作成でき、オプションとして型と値が合っている 初期化子を指定することができます:

>>> c_int()
c_long(0)
>>> c_char_p("Hello, World")
c_char_p('Hello, World')
>>> c_ushort(-3)
c_ushort(65533)
>>>

これらの型は変更可能であり、値を後で変更することもできます:

>>> i = c_int(42)
>>> print i
c_long(42)
>>> print i.value
42
>>> i.value = -99
>>> print i.value
-99
>>>

新しい値をポインタ型c_char_pc_wchar_p、 およびc_void_pのインスタンスへ代入すると、 メモリブロックの内容ではなく指しているメモリ位置が変わります、 (もちろんできません。なぜなら、Python文字列は変更不可能だからです):

>>> s = "Hello, World"
>>> c_s = c_char_p(s)
>>> print c_s
c_char_p('Hello, World')
>>> c_s.value = "Hi, there"
>>> print c_s
c_char_p('Hi, there')
>>> print s                 # 最初の文字列は変更されていない
Hello, World
>>>

しかし、変更可能なメモリを指すポインタであることを想定している関数へ それらを渡さないように注意すべきです。もし変更可能なメモリブロックが必要なら、 ctypesにはcreate_string_buffer関数があり、いろいろな方法で作成する ことできます。 現在のメモリブロックの内容はrawプロパティを使ってアクセス (あるいは変更)することができます。もし現在のメモリブロックにNUL終端文字列として アクセスしたいなら、valueプロパティを使ってください:

>>> from ctypes import *
>>> p = create_string_buffer(3)      # 3バイトのバッファを作成、NULで初期化される
>>> print sizeof(p), repr(p.raw)
3 '\x00\x00\x00'
>>> p = create_string_buffer("Hello")      # NUL終端文字列を含むバッファを作成
>>> print sizeof(p), repr(p.raw)
6 'Hello\x00'
>>> print repr(p.value)
'Hello'
>>> p = create_string_buffer("Hello", 10)  # 10バイトのバッファを作成
>>> print sizeof(p), repr(p.raw)
10 'Hello\x00\x00\x00\x00\x00'
>>> p.value = "Hi"      
>>> print sizeof(p), repr(p.raw)
10 'Hi\x00lo\x00\x00\x00\x00\x00'
>>>

create_string_buffer関数は初期のctypesリリースにあったc_string関数 だけでなく、(エイリアスとしてはまだ利用できる)c_buffer関数をも置き換えるものです。 Cの型wchar_tのユニコード文字を含む変更可能なメモリブロックを作成するには、 create_unicode_buffer関数を使ってください。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。