我编写了以下代码,存在一些区别,但我无法弄清楚。
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.
}
那两种类型有什么区别?我会得到相同的结果吗?以及为什么会发生这些错误?
答案 0 :(得分:3)
要添加到先前的答案中,指出点(.
)代表“普通”变量,箭头(->
)代表指针,请注意,箭头是与指针de等效的语法-reference后跟一个点,以方便使用(因为这是一种常见的操作)。
Hstring* s;
s->length; // this is equivalent to...
(*s).length; // ...this
需要括号,因为点的优先级高于星形。如果没有它们,您将是a)使用带指针的圆点,以及b)尝试取消对整数长度字段的引用,这两者都是无效的。
Hstring* s;
*s.length; // this is equivalent to...
*(s.length); // ...this (not what you want at all)
答案 1 :(得分:2)
区别在于点(.
)和箭头(->
)运算符。
您只能将点(.
)运算符与结构或联合变量一起使用以访问其成员。
您只能使用带有指针变量的箭头(->
)运算符来访问结构的成员或将指针指向的并集。
答案 2 :(得分:1)
如上所述,.
运算符用于访问结构的成员,而->
运算符用于访问 struct指针的成员强>。
但是,两个函数之间的另一个重要区别是,在Strlength(Hstring* s)
中,该参数是通过引用传递的传递的,这意味着该函数在数据结构的“原始”存储位置上运行因此可以修改其内容。
相反,在Strlength(Hstring s)
中,该参数通过值传递,这意味着该函数在原始结构的副本上进行操作,并且在函数外部所做的更改将不可见。功能。
另请参见this answer。
答案 3 :(得分:0)
*s
是一个指针,您可以使用运算符->
来引用成员,如果没有*
,它只是一个变量,则可以使用运算符(点){ {1}}