这一章主要介绍C语言的结构和其他数据形式,是学习算法和数据结构的重点。

1.示例代码

/*book.c -- 仅包含一本书的图书目录*/
#include <stdio.h>
#define MAXTITL 41
#define MAXAUTL 31

struct book
{
    /* data */
    char title[MAXTITL];
    char author[MAXAUTL];
    float value;
};

int main(void)
{
    struct book library; /* 把library声明为book类型的变量 */
    printf("Please enter the book title.\n");
    gets(library.title);
    printf("Now enter the author.\n");
    gets(library.author);
    printf("Now enter the value.\n");
    scanf("%f", &library.value);
    printf("%s by %s: $%.2f\n", library.title, library.author, library.value);
    printf("%s: \"%s\" ($%.2f)\n", library.author, library.title, library.value);
    printf("Done.\n");

    ;
}

  这个示例代码展示了如何建立结构声明:并没有创建一个实际的数据对象,而是描述了组成这类对象的元素(类似C++中的模版)。实际上,book的结构声明创建了一个名为struct book的新类型。也就是说

struct book library;

  等价于

struct book
{
    char title[MAXTITL];
    char author[MAXAUTL];
    float value;
} library;

  也可以不用标记book,但是这样就只能使用一次该模版。结构数组表示如下。

struct book library[MAXBKS];

2.指向结构的指针

  为什么要使用指向结构的指针:1.指向结构的指针通常比结构本身更容易操作;2.在一些早期的C实现中,结构不能作为参数被传递给函数,但是结构的指针可以;3.很多奇妙的数据表示都使用了包含指向其他结构的指针的结构。

/* friend.c -- 使用指向结构的指针 */
#include <stdio.h>
#define LEN 20

struct name
{
    /* data */
    char first[LEN];
    char last[LEN];
};

struct guy
{
    /* data */
    struct name handle;
    char favfood[LEN];
    char job[LEN];
    float income;
};

int main (void)
{
    ] =
    {
        {{"Ewen", "Villard"},
        "grilled salmon",
        "personality coach",
        58112.0
        },

        {{"Rodney", "Swillbelly"},
        "tripe",
        "tabloid editor",
        232400.0
        }
    };

    struct guy * him; /* 这是一个指向结构的指针 */
    printf (], &fellow[]);
    him = &fellow[];
    printf ();
    printf ("him->income is $%.2f: (*him).income is $%.2f\n", him->income, (*him).income);
    him++;
    printf ("him->favfood is %s: him->handle.last is %s\n", him->favfood, him->handle.last);
    ;

}

  看懂了上面的代码,基本就知道如何使用结构指针。需要注意的是,一个结构的名字不是该结构的地址,这个和数组不一样,必须使用&运算符。还一个就是,后跟->运算符的结构指针和后跟.(点)的结构名是一样的。

  那我们是选择结构还是结构指针呢?两者各有优缺点。把指针当作参数既能工作早期C也能工作在较新的C,而且执行起来很快,每次只需要传递单个地址。缺点是缺少对数据的保护。不过我们可以用const限定词解决这个问题。而把结构作为参数传递比直接处理原数据安全,编程风格也更清晰。

 

3.另外三种处理数据的特性

  这里简单说一下另外三种处理数据的特性:联合、枚举和typedef。

  联合是一个能在同一个存储空间里(但是不同时)存储不同类型数据类型的数据类型。各个变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。

  枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。本质上是int类型。

  typedef是声明新的类型名来代替原有的类型名。

C primer plus 读书笔记第十四章的更多相关文章

  1. 《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列

    信号量:用于管理对资源的访问: 共享内存:用于在程序之间高效的共享数据: 消息队列:在程序之间传递数据的一种简单方法: 一.信号量 临界代码:需要确保只有一个进程或者一个执行线程可以进入这个临界代码并 ...

  2. C primer plus 读书笔记第十二章

    C的强大功能之一在于它允许我们控制程序的细节.C的内存管理系统正是这种控制能力的例子.它通过让我们决定哪些函数知道哪些变量以及一个变量在程序中存在多长时间来实现这些控制. 1.存储类及其说明符 主要的 ...

  3. 《Linux内核设计与实现》读书笔记(十四)- 块I/O层

    最近太忙,居然过了2个月才更新第十四章.... 主要内容: 块设备简介 内核访问块设备的方法 内核I/O调度程序 1. 块设备简介 I/O设备主要有2类: 字符设备:只能顺序读写设备中的内容,比如 串 ...

  4. 《Android源代码设计模式解析与实战》读书笔记(十四)

    第十四章.迭代器模式 迭代器模式,又叫做游标模式.是行为型设计模式之中的一个.我们知道对容器对象的訪问必定会涉及遍历算法.我们能够将遍历的方法封装在容器中,或者不提供遍历方法,让使用容器的人自己去实现 ...

  5. C++ Primer Plus学习:第十四章

    第十四章 C++中的代码重用 包含对象成员的类 将类的对象作为新类的成员.称为has-a关系.使用公有继承的时候,类可以继承接口,可能还有实现(纯虚函数不提供实现,只提供接口).使用包含时,可以获得实 ...

  6. 《android开发艺术探索》读书笔记(十四)--JNI和NDK编程

    接上篇<android开发艺术探索>读书笔记(十三)--综合技术 No1: Java JNI--Java Native Interface(java本地接口),它是为了方便java调用C. ...

  7. 05 技术内幕 T-SQL 查询读书笔记(第四章)

    第四章 子查询:在外部查询内嵌套的内部查询(按照期望值的数量分为,标量子查询 scalar subqueries,多值子查询multivalued subqueries)(按照子查询对外部查询的依赖性 ...

  8. Linux内核分析 读书笔记 (第四章)

    第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间.进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有通过调度程序的合理调度,系统资源才能最大限 ...

  9. 《深入理解java虚拟机》读书笔记三——第四章

    第四章 虚拟机性能监控与故障处理工具 1.JDK命令行工具 jps命令: 作用:列出正在运行的虚拟机进程. 格式:jps [option] [hostid] 选项:-q 只输出LVMID(Local ...

随机推荐

  1. C++中extern关键字使用(转)

    参考文章:http://blog.csdn.net/sruru/article/details/7951019 chapter1.如何混合编译C语言和C++ 实际开发过程中,C++中会调用C与语言编写 ...

  2. 【清澄A1333】【整体二分+二维树状数组】矩阵乘法(梁盾)

    试题来源 2012中国国家集训队命题答辩 问题描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入格式 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共 ...

  3. Bootstrap_Javascript_弹出框

    HTML: <button type="button" class="btn btn-default" data-container="body ...

  4. 详解函数声明VS函数表达式

    函数声明 比方如下:1.我们以一个完整的语句以function开头,不加任何东西. 2.有一个函数名(add) 3.参数可带可不带(x,y) 4.有一个数体 满足以上要求的我们统称为函数声明! 附加小 ...

  5. apache 设置404页面

    这几天用xampp搭建了一套环境,后来发现在网页访问出现404的时候xampp显示的内容不安全,把apache.php还有一些其它的版本都会显示 出来,所以想自己设置一个404的页面,在网上找了一些资 ...

  6. 使用Raphael 画图(一) 基本图形 (javascript)

    Raphael是什么? Raphael 是一个用于在网页中绘制矢量图形的 Javascript 库.它使用 SVG W3C 推荐标准和 VML 作为创建图形的基础,你可以通过 JavaScript 操 ...

  7. how to make choices about girls?

    yb ldge nvhl, yige hf csmn, hv bmig, hv zofj, hfyb uhjnxn;ldyige ybdm bfbfde, gjjt hf djip, djui hfk ...

  8. java项目导出jar文件时指定main方法的类

    需要先运行一下main函数,eclipse的Export-->Runnable JAR File ---> 下的Launch configuration下拉列表才会有记录.如果想要删除下拉 ...

  9. OC面向对象的三大特征

    OC面向对象的三大特征 1.OC面向对象的三大特封装 1)封装:完整的说是成员变量的封装. 2)在成语方法里面的成员变量最好不要使用@public这样会直接暴露在外面被别人随随便便修改,封装的方法还可 ...

  10. 基于 SWTBot 进行 Eclipse GUI 自动化测试

    背景简介 在软件开发领域,持续集成和部署对于软件测试自动化提出了越来越高的要求,基于 Eclipse 应用在这一需求中仍然占据重要的组成部分.目前主流的测试自动化工具主要以录制回放的功能为主,辅助以脚 ...