0Pricing
Lua Academy · 课时

FFI 中的指针、结构体和数组

在 FFI 中使用 C 指针、结构体类型并分配数组。

FFI 中的指针、结构体和数组 是 CoddyKit 上的免费 Lua Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Lua Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Lua Academy 课程共包含 4 节课。

FFI 中的 C 类型

FFI 支持所有标准 C 类型:int、float、double、char、指针、数组和结构体。在 ffi.cdef 中声明它们。

创建 C 数组

使用 ffi.new("type[N]") 分配 C 数组。请使用从 0 开始的索引访问元素(遵循 C 约定)。

local ffi = require("ffi")
local arr = ffi.new("int[5]", {10, 20, 30, 40, 50})
print(arr[0], arr[1], arr[4])  -- 10  20  50

指针

创建指向某个值的指针,或分配指针类型。使用 ptr[0] 进行解引用。

local ffi = require("ffi")
local p = ffi.new("int[1]", 42)  -- int* pointing to 42
print(p[0])   -- 42
p[0] = 99
print(p[0])   -- 99

结构体定义与访问

在 cdef 中声明结构体,然后使用 ffi.new 创建实例,并通过点号表示法访问字段。

ffi.cdef[[
  typedef struct {
    float x, y, z;
  } Vec3;
]]
local v = ffi.new("Vec3", 1.0, 2.0, 3.0)
print(v.x, v.y, v.z)

结构体数组

创建结构体数组以批量处理数据,这在游戏引擎和数值计算中很常见。

local particles = ffi.new("Vec3[1000]")
for i = 0, 999 do
  particles[i].x = i * 0.1
  particles[i].y = 0
  particles[i].z = 0
end

指针运算

使用 ptr + n 移动指针。这会返回一个偏移了 n 个元素(而非 n 个字节)的新指针。

local arr = ffi.new("int[5]", {1,2,3,4,5})
local p = arr + 2   -- pointer to arr[2]
print(p[0])         -- 3

ffi.cast:类型转换

ffi.cast(ctype, val) 会将某个值重新解释为另一种 C 类型。请谨慎使用,错误的转换会导致未定义行为。

local ffi = require("ffi")
local i = ffi.cast("int32_t", -1)
print(i)  -- -1
local u = ffi.cast("uint32_t", i)
print(u)  -- 4294967295

ffi.sizeof 和 ffi.alignof

ffi.sizeof("Vec3") 返回 C 类型的字节大小。ffi.alignof 返回其对齐要求。

ffi.gc:附加终结器

ffi.gc(ptr, cleanup) 会将 Lua 函数附加到 C 指针上,以便在指针被 GC 回收时调用该函数,从而为 C 内存实现 RAII。

local p = ffi.gc(ffi.C.malloc(1024), ffi.C.free)
-- p is automatically freed when GC collects it

空指针检查

将指针与 nil 比较(在 FFI 比较中,nil 等于 C 的 NULL 指针)。

local ptr = lib.allocate()
if ptr == nil then error("allocation failed") end

C 数组的性能

通过 FFI 访问的 C 数组在处理数值数据时明显快于 Lua 表,因为不需要装箱、哈希查找或类型检查。

FFI 数组问题

FFI 对 C 数组使用什么索引?

回顾:FFI 中的指针、结构体与数组

使用 ffi.new("type[N]") 创建 C 数组(索引从 0 开始),使用点号表示法访问结构体字段,使用 ffi.cast 重新解释类型,并使用 ffi.gc 自动清理 C 内存。

常见问题解答

「FFI 中的指针、结构体和数组」课时是免费的吗?

是的 — 「FFI 中的指针、结构体和数组」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Lua Academy 课程的其余内容,请升级到 CoddyKit PRO。 Lua Academy 课程共包含 4 节课。

「FFI 中的指针、结构体和数组」这节课中我会学到什么?

在 FFI 中使用 C 指针、结构体类型并分配数组。 你通过在浏览器中直接运行的动手代码来练习 Lua Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Lua Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Lua Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「FFI 中的指针、结构体和数组」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Lua Academy 课中编写并运行代码吗?

能。每节 Lua Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. FFI 基础:ffi.cdef 和 ffi.load
  2. 通过 FFI 调用 C 函数
  3. FFI 中的指针、结构体和数组
  4. 回调:将 Lua 函数传递给 C
← 返回 Lua Academy