• C Primer Plus(6) 中文版 第14章 结构和其他数据形式 14.6 指向结构的指针


    14.6 指向结构的指针
    喜欢使用指针的人一定很高心使用指向结构的指针。至少有4个理由可以解释为何要使用指向结构的指针。第一,就像指向数组的指针比数组本身更容易操控(如,排序问题)一样,指向结构的指针通常比结构本身更容易操控。第二,在一些早期的C实现中,结构不能作为参数传递给函数,但是可以传递指向结构的指针;第三,即使能传递一个结构,传递指针通常更有效率。第四,一些用于表示数据的结构中包含指向其他结构的指针。
    程序清单14.4 friends.c程序
    /* friends.c -- uses pointer to a structure */
    #include
    #define LEN 20

    struct names {
        char first[LEN];
        char last[LEN];
    };

    struct guy {
        struct names handle;
        char favfood[LEN];
        char job[LEN];
        float income;
    };

    int main(void)
    {
        struct guy fellow[2] = {
            {{ "Ewen", "Villard"},
                "grilled salmon",
                "personality coach",
                68112.00
            },
            {{"Rodney", "Swillbelly"},
                "tripe",
                "tabloid editor",
                432400.00
            }
        };
        struct guy * him;    /* here is a pointer to a structure */
        
        printf("address #1: %p #2: %p\n", &fellow[0], &fellow[1]);
        him = &fellow[0];    /* tell the pointer where to point  */
        printf("pointer #1: %p #2: %p\n", him, him + 1);
        printf("him->income is $%.2f: (*him).income is $%.2f\n",
               him->income, (*him).income);
        him++;               /* point to the next structure      */
        printf("him->favfood is %s:  him->handle.last is %s\n",
               him->favfood, him->handle.last);
        
        return 0;

    /* 输出:

    */

    14.6.1 声明和初始化结构指针
    声明结构指针很简单:
    struct guy *him;
    首先是关键字struct,其次是结构标记guy,然后是一个星号(*),其后跟着指针名。这个语法和其他指针声明一样。
    该声明并未创建一个新的结构,但是指针him现在可以指向任意现有的guy类型的结构。
    和数组不同,结构变量名不是结构变量的地址,因此要在结构变量名前面加上&运算符。
    顺带一提,在有些系统中,一个结构的大小可能大于它各成员大小之和。这是因为系统对数据进行校准的过程中产生了一些“缝隙”。
    14.6.2 用指针访问成员
    如何通过him访问fellow[0]的成员的值?程序清单14.4中的第3行输出演示了两种方法。
    第1种方法也是最常用的方法:使用->运算符。该运算符由一个连接号(-)后跟一个大于号(>)组成。
    如果him == &barney,那么him->income 即是 barney.income
    如果him == &fellow[0],那么him->income 即是 fellow[0].income
    换句话说,指向结构的指针后面的->运算符和结构变量名后面的.运算符工作方式相同。
    第2种方式是,以这样的顺序指定结构成员的值:如果him==&fellow[0],那么*him==fellow[0],因为*和&是一对互逆运算符。因此,可以做以下替代:
    fellow[0].income == (*him).income
    必须使用圆括号,因为.运算符比*运算符的优先级高。
    总是,如果him是指向guy类型结构barney的指针,下面的关系恒成立:
    barney.income == (*him).income == him->income //假设him == &barney

  • 相关阅读:
    证券行业超融合架构方案设计
    .NET中测量多线程基准性能
    python中elasticsearch_dsl模块用法详解
    LeetCode_原地哈希_中等_442.数组中重复的数据
    PostgreSQL部署与配置
    【我赢助手系列】短视频创作选题优化、丰富内容价值关键点汇总
    Java_笔记_继承_虚方法表_成员变量方法构造_thisSuper
    django 自动化脚本的开发 - 脚本仅启动运行一次 / 执行定时任务 - 测试过程
    Spring Cloud框架学习-Spring Cloud Gateway
    搜索系统中的文本相关性实践经验
  • 原文地址:https://blog.csdn.net/weixin_40186813/article/details/126502555