zIg的结构体传递似乎都是指针,比如如下code:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20

const someint = struct {
    c: i32,
};

fn input(c: someint) void {
    //在调用栈上传递。
    std.debug.print("{}\n", .{@ptrToInt(&c)});
}

test {
    var a: i32 = 1;
    std.debug.print("{}\n", .{&a});
    var c: someint = .{ .c = 2 };
    //直接打印地址
    std.debug.print("{}\n", .{@ptrToInt(&c)});
    std.debug.print("{}\n",  .{&c});
    input(c);
}

结果:

1
2
3
4
i32@7ff7b2663dd4
140701826694608
someint{ .c = 2 } //打印结构体的指针,和直接打印结构体效果一致。
140701826694608 //函数内打印和函数外打印地址相等

这个例子展示,首先,如果传递一个结构体在调用栈上,实际上传递的是指针。

这里其实有一个优化,因为zig的函数参数默认都是const,那么我传递一个const struct,意味着我不可能修改struct内任何值,所以传递一个指针似乎没有什么问题。

同样也可以传递一个结构体的指针,此时可以修改struct了:

1
2
3
4
fn input(c:*someint) void {
    // can access c->c, c->c is mutable,
    // but c is a const point to someint struct.
}