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]) -- 3ffi.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) -- 4294967295ffi.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") endC 数组的性能
通过 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 反馈 — 无需本地设置。
此课程中的所有课时
- FFI 基础:ffi.cdef 和 ffi.load
- 通过 FFI 调用 C 函数
- FFI 中的指针、结构体和数组
- 回调:将 Lua 函数传递给 C