Pointers

Los punteros normales en Zig no pueden tener 0 o null como valor. Siguen la sintaxis *T, donde T es el tipo hijo.

La referencia se realiza con &variable y la desreferencia se realiza con variable.*.

fn increment(num: *u8) void {
    num.* += 1;
}

test "pointers" {
    var x: u8 = 1;
    increment(&x);
    try expect(x == 2);
}

Intentar establecer un *T en el valor 0 es un comportamiento ilegal detectable.

test "naughty pointer" {
    var x: u16 = 0;
    var y: *u8 = @ptrFromInt(x);
    _ = y;
}
Test [23/126] test.naughty pointer... thread 21598 panic: cast causes pointer to be null
./test-c1.zig:252:18: 0x260a91 in test.naughty pointer (test)
    var y: *u8 = @ptrFromInt(x);
                 ^

Zig también tiene punteros constantes, que no pueden ser utilizados para modificar los datos referenciados. Referenciar una variable constante producirá un puntero constante.

test "const pointers" {
    const x: u8 = 1;
    var y = &x;
    y.* += 1;
}
error: cannot assign to constant
    y.* += 1;
        ^

Un *T se convierte en un *const T.

Edita esta pagina Última actualización: 5/15/2024 por Vital