这两个语句有什么区别?

时间:2019-10-24 07:13:47

标签: c function pointers struct

我编写了以下代码,存在一些区别,但我无法弄清楚。

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.
}

那两种类型有什么区别?我会得到相同的结果吗?以及为什么会发生这些错误?

4 个答案:

答案 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}}