繁体   English   中英

指向变量的指针与指向C中结构的指针之间的区别

[英]Difference between pointers to variables, and pointers to structures in C

在学习C时,我刚开始研究结构指针并提出一些问题。

假设我要创建一个名为myStructure的结构,然后创建一个指向myStructurePointer的指针myStructure *myStructurePointermyStructure两种引用相同的方法吗? 如果是这样,为什么有必要使用 - >运算符? 使用*myStructurePointer.variable_name比使用myStructurePointer->variable_name更简单。

你是对的,

(*structurePointer).field

与...完全相同

structurePointer->field

但是,你拥有的是:

*structurePointer.field

哪个真的试图使用. 在指针变量上运算符,然后取消引用它的结果 - 它甚至不会编译。 如果你想让表达式相同,你需要在上面第一个例子中使用括号。 在这个简单的例子中,箭头至少可以节省几次击键次数。

如果考虑结构字段具有指针类型的情况,可能使用->可能更有意义,可能是另一种结构:

structurePointer->field->field2

(*(*structurePointer).field).field2

*myStructurePointer.variable_name的问题是*绑定不如. ,因此它将被解释为*(myStructurePointer.variable_name) myStructurePointer->variable_name的等价物是(*myStructurePointer).variable_name ,其中括号是必需的。

a->b(*a).b之间没有区别,但是->更容易使用,特别是如果有嵌套结构。 (*(*(*a).b).c).d可读性远低于' - > b-> c-> d`。

要概括,请了解您的C运算符优先级:

这里的“。” 运算符在“*”之前处理 - >因此需要括号

Dennis Ritchie曾经注意到deref应该是一个后缀运算符1

对,以下是等价的:

pointer->field
(*pointer).field
pointer[0].field

如果间接运算符有后缀语法C看起来会有所不同,但在这种情况下它根本不需要->

考虑常见的C成语在那个替代宇宙中的表现会很有趣......

do s1++* = c = s2++*;
   while(c);

while(n-- > 0)
    s++* = '\0';

p*.x = 1;
p*.y = 2;
. . .
. . .
. . .

1. 参见C语言的发展。 ,Dennis M. Ritchie

使用*取消引用指针,因此您可以使用点语法来访问字段。 如果不取消引用指针,则使用 - >访问字段。 您可以使用您喜欢的任何一种。

我最近一直在学习C,我发现这个资源非常有帮助。

http://claymore.engineer.gvsu.edu/~steriana/226/C.CheatSheet.pdf

暂无
暂无

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

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