###
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_p`、`c_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`関数を使ってください。