首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zig结构、指针、字段访问

zig结构、指针、字段访问
EN

Stack Overflow用户
提问于 2021-07-20 11:25:55
回答 2查看 1.5K关注 0票数 3

我试着用通用算法来实现向量代数,最后用迭代器来完成。我发现了两个不明显和意想不到的行为的例子:

  1. 如果我有指向带有字段fi的结构(实例)的指针fi,则可以像访问p.fi (而不是p.*.fi)一样简单地访问该字段。
  2. 如果我有一个“成员”函数fun(this: *Self) (其中Self = @This())和结构的实例s,我可以像调用s.fun() (而不是(&s).fun())一样简单地调用该函数。

我的问题是:

  1. 是否有记载(或以任何方式提及)?我查阅了ziglearn.org的语言参考资料和指南,但没有发现任何东西
  2. 我们在这些例子中观察到了什么?两种特殊情况下的语法糖,还是有更一般的规则可以推断出这样的行为?
  3. 还有更多奇怪指针行为的例子吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-20 11:57:05

对于1和2,你是正确的。在Zig中,点透明地工作在struct值和struct指针上。类似地,命名空间函数在调用时也会做正确的事情。

我唯一能想到的其他类似行为是数组上使用的[]语法。可以直接对数组值和数组指针进行交替使用。这在某种程度上相当于点在结构上的操作方式。

代码语言:javascript
复制
const std = @import("std");

pub fn main() !void {
   const arr = [_]u8{1,2,3};
   const foo = &arr;

   std.debug.print("{}", .{arr[2]});
   std.debug.print("{}", .{foo[2]});
}

AFAIK --这是这种行为的三个实例。在所有其他情况下,如果某物请求一个指针,则必须显式地提供它。即使将数组传递给接受片的函数,也必须显式地接受数组的指针。

权威的信息来源是语言参考,但快速检查,它似乎没有一个专门的段落。也许我错过了一些例子。

https://ziglang.org/documentation/0.8.0/

票数 2
EN

Stack Overflow用户

发布于 2021-10-22 20:47:46

我第一次学习这个语法是通过阅读链接到ziglang.org上的ziglings课程。

在练习43 (pointers5.zig)中

代码语言:javascript
复制
// Note that you don't need to dereference the "pv" pointer to access
// the struct's fields:
//
//     YES: pv.x
//     NO:  pv.*.x
//
// We can write functions that take pointer arguments:
//
//     fn foo(v: *Vertex) void {
//         v.x += 2;
//         v.y += 3;
//         v.z += 7;
//     }
//
// And pass references to them:
//
//     foo(&v1);

ziglings课程在一些语言主题上非常深入,所以如果您感兴趣的话,肯定要检查一下。

关于其他语法:正如前面的答案所提到的,您不需要取消引用数组指针。我不确定还有什么其他的(我认为函数指针同样有效,但我只是运行了一些测试,但它们没有)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68454051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档