【问题标题】:Difference between "->" and "." in C [duplicate]“->”和“.”之间的区别在 C [重复]
【发布时间】:2012-12-14 18:25:05
【问题描述】:

可能重复:
Arrow operator (->) usage in C

我试图找出“。”之间的区别。和“->”C 语言中的数据访问样式。 例如。

struct div{
    int quo;
    int rem;
};

1) 使用“->”

struct div *d = malloc(sizeof(struct div));
d->quo = 8/3;
d->rem = 8%3;
printf("Answer:\n\t Quotient = %d\n\t Remainder = %d\n-----------\n",d->quo,d->rem);

2) 使用“.”

struct div d;
d.quo = 8/3;
d.rem = 8%3;
printf("Answer:\n\t Quotient = %d\n\t Remainder = %d\n-----------\n",d.quo,d.rem);

这两种情况我得到相同的输出。

答案:商 = 2 余数 = 2

这两种方法在内部如何运作?什么时候应该使用哪一个? 我尝试在互联网上搜索它,但没有太大帮助。任何相关的链接也很感激。

它们在内存中的存储也有什么区别吗?

【问题讨论】:

  • StackOverflow 周围的某个地方有一个完美的答案,让我现在就找到它...
  • Here's another which explains C++ 上下文中的差异(C 部分仍然存在)。
  • 你的答案就在于你的问题本身。它不在.-> 之间,而是在访问数据的上下文中。

标签: c


【解决方案1】:

基本区别是这样的:

. is the member of a structure
-> is the member of a POINTED TO structure

所以. 用于直接访问结构中的变量时。但-> 用于通过指向该结构的指针访问结构的变量。

假设你有 struct a:

struct a{
    int b;
}

但是如果说c 是指向a 的指针,那么你知道:c = (*a)。因此,-> 被用作. 特定情况的替代方案。所以不用(*a).b,你可以用c->b,它们是完全一样的。

【讨论】:

    【解决方案2】:

    -> 是根据. 定义的

    也就是说,a->b 等价于 (*a).b,因此您显然会得到相同的结果。

    -> 存在是为了方便。

    【讨论】:

      【解决方案3】:

      处理指向结构的指针时,使用->,直接使用它们时,使用.

      【讨论】:

        【解决方案4】:

        当您需要手动管理已创建对象的生命周期时,请使用第一种方法。当创建的对象的生命周期仅限于创建它的范围或包含它的对象的范围时,请使用第二种方法。

        【讨论】:

        • 它们在内存中的存储有什么区别吗?
        • @AtulGupta:这取决于实施。通常,new 将在堆上分配,在特定范围内声明对象将在堆栈​​上分配分配时已知的内容以及稍后在堆上动态分配的任何内容。
        • 我的理解是,在情况(1)中,struct div *d 的内存将在堆上分配,因为我使用的是 malloc。而在情况(2)中,它将被分配在堆栈上。如果我错了,请纠正我。
        • “在堆上”是一种不精确、模棱两可、特定于实现的语言,被广泛用于代替正确的短语“分配的存储持续时间”。请参阅“6.2.4 对象的存储时长”和“7.20.3 内存管理功能”。
        【解决方案5】:

        在 C 中,->. 非常相似,但处理的是指针。在结构中,. 用于直接引用结构内的成员,而-> 用于引用指向结构的成员。使用指针或不使用指针,您会得到几乎相同的结果,具体取决于具体情况。

        a -> b(*a).b 相同

        把它想象成a = a + 1。为简单方便起见,a++ 用于实现完全相同的结果。

        【讨论】:

          【解决方案6】:

          简单来说,期望给出相同的结果,您所做的是更改内存分配以及如何访问结构中的数据。 an tutorial about dynamic memory allocationWorking with Dynamic Memory in C++ 是一些关于您想了解的内容的好链接。

          【讨论】:

            【解决方案7】:

            当使用.时,它被称为结构成员..

            当使用->时,它被称为指向成员的指针..

            如果使用指向成员的指针,它可以像这样解决..

            x -> y 和 (*x).y 都是一样的..

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-02-28
              • 2011-12-02
              • 2013-07-17
              • 1970-01-01
              • 1970-01-01
              • 2023-03-17
              • 2014-08-16
              • 2011-04-08
              相关资源
              最近更新 更多