Punteros, structs y arrays en FFI
Trabaje con punteros C, tipos struct y asignaciones de arrays en FFI.
Punteros, structs y arrays en FFI es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.
Tipos de C en FFI
FFI admite todos los tipos estándar de C: int, float, double, char, punteros, arrays y estructuras. Declárelos en ffi.cdef.
Crear arrays de C
Asigne un array de C con ffi.new("type[N]"). Acceda a los elementos mediante índices basados en 0 (la convención de 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 50Punteros
Cree un puntero a un valor o asigne tipos de puntero. Use ptr[0] para desreferenciarlo.
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]) -- 99Definición y acceso a estructuras
Declare una estructura en cdef, cree después instancias con ffi.new y acceda a sus campos mediante notación de punto.
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)Array de estructuras
Cree arrays de estructuras para procesar datos en bloque, algo habitual en motores de juegos y en computación numérica.
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
endAritmética de punteros
Avance un puntero con ptr + n. Esto devuelve un puntero nuevo desplazado n elementos, no n bytes.
local arr = ffi.new("int[5]", {1,2,3,4,5})
local p = arr + 2 -- pointer to arr[2]
print(p[0]) -- 3ffi.cast: conversión de tipos
ffi.cast(ctype, val) reinterpreta un valor como otro tipo de C. Úselo con cuidado: las conversiones incorrectas provocan un comportamiento indefinido.
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 y ffi.alignof
ffi.sizeof("Vec3") devuelve el tamaño en bytes de un tipo de C. ffi.alignof devuelve su requisito de alineación.
ffi.gc: asociar finalizadores
ffi.gc(ptr, cleanup) asocia una función de Lua a un puntero de C para que se llame cuando el puntero se libere mediante el GC, lo que permite aplicar RAII a la memoria de C.
local p = ffi.gc(ffi.C.malloc(1024), ffi.C.free)
-- p is automatically freed when GC collects itComprobar punteros nulos
Compare los punteros con nil (que equivale al puntero NULL de C en las comparaciones de FFI).
local ptr = lib.allocate()
if ptr == nil then error("allocation failed") endRendimiento de los arrays de C
Acceder a arrays de C mediante FFI es considerablemente más rápido que usar tablas de Lua para datos numéricos: no hay boxing, búsquedas hash ni comprobaciones de tipos.
Pregunta sobre los arrays de FFI
¿Qué índice utiliza FFI para los arrays de C?
Resumen: punteros, estructuras y arrays en FFI
Cree arrays de C con ffi.new("type[N]") (indexados desde 0), acceda a los campos de las estructuras mediante notación de punto, use ffi.cast para reinterpretar tipos y ffi.gc para limpiar automáticamente la memoria de C.
Preguntas frecuentes
¿La lección «Punteros, structs y arrays en FFI» es gratis?
Sí — el texto completo de «Punteros, structs y arrays en FFI» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Punteros, structs y arrays en FFI»?
Trabaje con punteros C, tipos struct y asignaciones de arrays en FFI. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Lua Academy?
No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Punteros, structs y arrays en FFI»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Lua Academy?
Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Conceptos básicos de FFI: ffi.cdef y ffi.load
- Llamada a funciones C mediante FFI
- Punteros, structs y arrays en FFI
- Callbacks: pasar funciones de Lua a C