繁体   English   中英

这两种说法有什么区别?

[英]what's the difference between the two statements?

我写了以下代码,存在一些差异,但我无法弄清楚。

typedef struct {
    char* ch;   
    int length;
}Hstring;
int Strlength(Hstring* s) {
    return s->length; // if I use s.length there, error occurs.
}
int Strlength(Hstring s) {
    return s.length; // if I use s->length there, error occurs.
}

那么这两种类型有什么区别呢? 我会得到同样的结果吗? 为什么会出现这些错误?

要添加到前面的答案 state 点( . )用于“普通”变量,箭头( -> )用于指针,请注意,箭头的语法等同于指针取消引用后跟点,为方便起见(因为这是一种常见的操作)。

Hstring* s;
s->length;   // this is equivalent to...
(*s).length; // ...this

括号是必需的,因为 dot 的优先级高于 star。 没有它们,您将 a) 使用带指针的点和 b) 尝试取消引用 integer 长度字段,这两者都是无效的。

Hstring* s;
*s.length;   // this is equivalent to...
*(s.length); // ...this (not what you want at all)

区别在于点 ( . ) 和箭头 ( -> ) 运算符。

您只能将点 ( . ) 运算符与结构或联合变量一起使用来访问其成员。

您只能将箭头 ( -> ) 运算符与指针变量一起使用来访问指针指向的结构或联合的成员。

如前所述, . 运算符用于访问struct的成员,而->运算符用于访问struct 指针的成员。

但是,您的两个函数之间的另一个重要区别是,在Strlength(Hstring* s)中,参数是通过引用传递的,这意味着 function 在数据结构的“原始” memory 位置上运行,因此可以修改其内容。

相比之下,在Strlength(Hstring s)中,参数是按值传递的,这意味着 function 对原始结构的副本进行操作,并且在 function 中所做的更改在 ZC1C425268D17A48 之外将不可见。

另请参阅此答案

*s是一个指针,你可以使用 operator ->来引用成员,如果没有* ,它只是一个变量,你可以使用 operator (dot) 来引用成员.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM