65 lines
1.6 KiB
Plaintext
65 lines
1.6 KiB
Plaintext
/* ===== 模块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;
|
||
}
|