Pointers
Zig中的普通指针不允许有0或null作为值。它们遵循的语法是*T,其中T是子类型。
引用是用&variable进行的,而取消引用是用variable.*进行的 .
fn increment(num: *u8) void {
num.* += 1;
}
test "pointers" {
var x: u8 = 1;
increment(&x);
try expect(x == 2);
}
试图将一个*T设置为0的值是可以检测到的非法行为 .
test "naughty pointer" {
var x: u16 = 0;
var y: *u8 = @intToPtr(*u8, x);
_ = y;
}
test "naughty pointer"...cast causes pointer to be null
.\tests.zig:241:18: 0x7ff69ebb22bd in test "naughty pointer" (test.obj)
var y: *u8 = @intToPtr(*u8, x);
^
Zig也有常态指针,它不能用来修改被引用的数据。引用一个常量变量将产生一个常量指针 .
test "const pointers" {
const x: u8 = 1;
var y = &x;
y.* += 1;
}
error: cannot assign to constant
y.* += 1;
^
A *T 强制转换成 *const T.
Pointer sized integers 指针大小的整数
usize和isize是以无符号和有符号的整数形式给出的,与指针大小相同.
test "usize" {
try expect(@sizeOf(usize) == @sizeOf(*u8));
try expect(@sizeOf(isize) == @sizeOf(*u8));
}
Many-Item Pointers
有时你可能有一个指向未知数量元素的指针。[*]T是解决这个问题的方法,它的工作方式与*T类似,但也支持索引语法、指针算术和分片。不像*T,它不能指向一个没有已知大小的类型。*T会强制变成[*]T。
这些许多指针可以指向任何数量的元素,包括0和1