[英]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.