test:zig
This commit is contained in:
49
guide/language/pointers.zig
Normal file
49
guide/language/pointers.zig
Normal file
@@ -0,0 +1,49 @@
|
||||
const expect = @import("std").testing.expect;
|
||||
const print = @import("std").debug.print;
|
||||
|
||||
// Normal pointers in Zig cannot have 0 or null as a value. They follow the syntax *T, where T is the child type.
|
||||
// Referencing is done with &variable, and dereferencing is done with variable.*.
|
||||
fn increment(num: *u8) void {
|
||||
num.* += 1;
|
||||
}
|
||||
|
||||
test "pointers" {
|
||||
var x: u8 = 1;
|
||||
increment(&x);
|
||||
try expect(x == 2);
|
||||
}
|
||||
|
||||
// Trying to set a *T to the value 0 is detectable illegal behaviour.
|
||||
test "naughty pointer" {
|
||||
var x: u16 = 5;
|
||||
x -= 5;
|
||||
var y: *u8 = @ptrFromInt(x);
|
||||
y = 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 also has const pointers, which cannot be used to modify the referenced data.
|
||||
// Referencing a const variable will yield a const pointer.
|
||||
|
||||
test "const pointers" {
|
||||
// const x: u8 = 1;
|
||||
// var y = &x;
|
||||
// y.* += 1;
|
||||
}
|
||||
|
||||
// error: cannot assign to constant
|
||||
// y.* += 1;
|
||||
// ^
|
||||
// A *T coerces to a *const T.
|
||||
|
||||
// Pointer Sized Integers
|
||||
// `usize` and `isize` are given as unsigned and signed integers which are the same size as pointers.
|
||||
|
||||
test "usize" {
|
||||
try expect(@sizeOf(usize) == @sizeOf(*u8));
|
||||
try expect(@sizeOf(isize) == @sizeOf(*u8));
|
||||
}
|
||||
Reference in New Issue
Block a user