这一章主要介绍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. Codeforces 474E - Pillars

    一眼看上去非常像最长不下降子序列. 然后比赛的时候对每个答案长度为k的序列,维护最后一个数的最大值和最小值. 当时不知道为什么认为从长度最长倒推至前面不会太长,于是心满意足地敲了个O(n^2).结果T ...

  2. 常见的iis日志代码!

    2xx  成功 200  正常:请求已完成. 201  正常:紧接 POST 命令. 202  正常:已接受用于处理,但处理尚未完成. 203  正常:部分信息 — 返回的信息只是一部分. 204   ...

  3. 中级Perl第二章习题

    2. 4. 1. 习题1 [15 分钟] 写一个程序从命令行取一个文件清单, 然后用grep 把那些文件大小在1000 字节以内的文件找出来.用map 把这个清单里的每个字串前加四个空格并在 字串后面 ...

  4. android 开源项目学习

    1.Android团队提供的示例项目 如果不是从学习Android SDK中提供的那些样例代码开始,可能没有更好的方法来掌握在Android这个框架上开发.由Android的核心开发团队提供了15个优 ...

  5. iOS - 正则表达式判断邮箱、身份证..是否正确:

    iOS - 正则表达式判断邮箱.身份证..是否正确: //邮箱 + (BOOL) validateEmail:(NSString *)email {     NSString *emailRegex ...

  6. Java中传参的值传递和引用传递问题(转)

    今天遇到了一个java程序,需要用参数来返回值(虽然最后用另一种方法实现了),在网上看到这样一篇文章,很受启发. 本文章来自于http://hi.baidu.com/xzhilie/blog/item ...

  7. Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四)

    Solr4.8.0源码分析(23)之SolrCloud的Recovery策略(四) 题记:本来计划的SolrCloud的Recovery策略的文章是3篇的,但是没想到Recovery的内容蛮多的,前面 ...

  8. C# 关于NULL 可空值类型 ? 和空接操作符??

    作者 陈嘉栋(慕容小匹夫) C#引入了可空值类型的概念.在介绍究竟应该如何使用可空值类型之前,让我们先来看看在基础类库中定义的结构--System.Nullable<T>.以下代码便是Sy ...

  9. pycharm去掉拼写检查

    http://zhidao.baidu.com/question/523436629.html

  10. BZOJ 1483 梦幻布丁

    Description \(N\)个布丁摆成一行,进行\(M\)次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为\(1,2,2,1\)的四个布丁一共有\ ...