zoukankan      html  css  js  c++  java
  • C语言:结构体中(.)和(->)的区别

    https://blog.csdn.net/faihung/article/details/79190039

    这虽然是个小问题,但有时候很容易让人迷惑,因为有的时候用混淆了,程序编译不通过。

    下面说说我对它们的理解。

    一般情况下用“.”,只需要声明一个结构体。格式是,结构体类型名+结构体名。然后用结构体名加“.”加域名就可以引用域 了。因为自动分配了结构体的内存。如同 int a;一样。

    而用“->”,则要声明一个结构体的指针,还要手动开辟一个该结构体的内存,然后把返回的指针给声明的结构体指针,才能用“->”正确引用。否则内存中只分配了指针的内存,没有分配结构体的内存,导致想要的结构体实际上是不存在。这时候用“->”引用自然出错了,因为没有结构体,自然没有结构体的域了。

    此外,(*a).b 等价于 a->b。

    "."一般情况下读作"的”。

    “->”一般读作"指向的结构体的"。

    https://blog.csdn.net/alidada_blog/article/details/80353343

    一直以为这两个是没有什么区别的,可以相互替换,今天又翻了一下《C语言核心技术》,明白了其中的奥妙。 

    相同点:两个都是二元操作符,其右操作符是成员的名称。

    不同点:点操作符左边的操作数是一个“结果为结构”的表达式;

                    箭头操作符左边的操作数是一个指向结构的指针。

    举例说明:

    #include <string.h>

    Song_t  song1,song2,                        //两个Song_t类型的对象

                    *pSong = &song1;              //和一个指向Song_t的指针

    strcpy(song1.composer,"Ottma Liebert");

    song1.duration = 251;

    song1.published.year = 1998;

    if((*pSong).duration >180)

         printf("The song is more than 3 mimutes long. ");

    --最后一句也可以改写为:

    if(pSong->duration > 180) .... 

    另外一点体会:如果一个函数的传入参数是结构体,且需要该结构体作为返回值的时候,必须采用指针传递的方式,其中对结构体赋值必须使用箭头运算符。

    int  iSetValue(Song_t *pSong)

    {

      strcpy( pSong ->composer,"123");

      pSong->duration = 251;

     ...

    }

  • 相关阅读:
    我的省选 Day -9
    我的省选 Day -10
    我的省选 Day -11
    我的省选 Day -12
    我的省选 Day -13
    [NOI2013]快餐店
    我的省选 Day -14
    杭电多校2020第7场-E Expectation
    「联合省选2020」组合数问题
    UR#19 通用评测号
  • 原文地址:https://www.cnblogs.com/do-your-best/p/11008205.html
Copyright © 2011-2022 走看看