声明但未定义的对象

可以是未完成对象的类型

结构体,共用体,arrays

这三种前期可以被声明但是没有被定义。

比如说C语言中的结构体,这个案例中我们先进行了声明,同样可以以这种方式声明class。然后定义实体,这种在需要相互嵌套的情况是非常有必要的。

struct cell.

struct cell{
    char * name;
    struct cell * next;
}

将上面这个直接翻译成为ctypes就是下面这种

>>> class cell(Structure):
...     _fields_ = [("name", c_char_p),
...                 ("next", POINTER(cell))]

那么在这里,cell就是上面的celll,因为是直译。但是这个往往是错误的,因为next里面的cell没有定义

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in cell
NameError: name 'cell' is not defined
>>>

因为cell对象不能直接在cell内部直接引用。那么在这里面,我们可以通过先声明这个实体。

然后再定义相应的属性。

>>> from ctypes import *
>>> class cell(Structure):
...     pass
...
>>> cell._fields_ = [("name", c_char_p),
...                  ("next", POINTER(cell))]
>>>

下面案例将会创建两个cell对象,然后分别指向对方。

>>> c1 = cell()
>>> c1.name = "foo"
>>> c2 = cell()
>>> c2.name = "bar"
>>> c1.next = pointer(c2)
>>> c2.next = pointer(c1)
>>> p = c1
>>> for i in range(8):
...     print(p.name, end=" ")
...     p = p.next[0]
...
foo bar foo bar foo bar foo bar
>>>

上面是相互指向,然后通过for,形成了环的进行遍历。next[0]是进行解指针。

猜你喜欢

转载自blog.csdn.net/rubikchen/article/details/89578738