/* ===== 模块4:指针 ===== * test07_pointers — 指针操作 * 难度:2/5 * 验证点:& 取地址、* 解引用、null 空指针、指针自动解引用(->)、.* 后缀解引用 */ fn inc(ptr: *i32) void { *ptr = *ptr + 1; } fn main() i32 { /* ---- & 取地址和 * 解引用 ---- */ var x: i32 = 42; var p: *i32 = &x; var v := p.*; if v != 42 { ret 1; } /* 通过指针修改 */ p.* = 99; if x != 99 { ret 2; } /* 指针作为函数参数 */ var y: i32 = 5; inc(&y); if y != 6 { ret 3; } /* ---- null 空指针 ---- */ var np: *i32 = null; if np != null { ret 4; } if np == null {} else { ret 5; } /* ---- 指针自动解引用(ptr.field 相当于 ptr->field) ---- */ type Point = struct { a: i32, b: i32, }; var pt: Point; pt.a = 10; pt.b = 20; var pp: *Point = &pt; if pp.a != 10 { ret 6; } if pp.b != 20 { ret 7; } /* 通过指针修改字段 */ pp.a = 30; if pt.a != 30 { ret 8; } /* ---- 指向数组元素的指针 ---- */ var buf: [4]i32 = [4]i32{1, 2, 3, 4}; // @dbg(); /* 数组初始化后的栈状态 */ var elem_ptr: *i32 = &buf[0]; // @dbg(); /* &buf[0] 之后:栈上应有指针值 */ var loaded := elem_ptr.*; // @dbg(); /* 解引用后:loaded 值 */ if loaded != 1 { ret 9; } elem_ptr = &buf[1]; // @dbg(); /* &buf[1] 之后 */ var loaded2 := elem_ptr.*; // @dbg(); /* 解引用后:loaded2 值 */ if loaded2 != 2 { ret 10; } ret 0; }