这一章主要介绍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++类型萃取的编写技巧

    废话不多说,上来贴代码最实在,哈哈! 以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过 #include<io ...

  2. SGU 138.Games of Chess

    时间限制:0.25s 空间限制:4M 题目: n个朋友在一起按照下面的规则依次下棋:在第一局游戏,n个人中的两个开始下棋.在第二局,第一局胜利的人将跟其他人下棋(也可能还是输了第一局人), 在第三局第 ...

  3. js数学方法应用

    找出数组中最大的数 var values = [1, 2, 3, 4, 5, 6, 7, 8]; alert(Math.min.apply(Math,values))//8 这个技巧的关键是把 Mat ...

  4. [转]iframe自适应宽度高度

    <iframe id="iframe" onLoad="AutoFit();" frameborder="0" scrolling=& ...

  5. WPF之核心面板(容器)控件简单介绍

    一.Canvas 1.官方表述:定义一个区域,在该区域中可以使用相对于该区域的坐标显式定位子元素. 2.对于canvas 的元素的位置,是靠控件的大小及Canvas.Top.Canvas.Left.C ...

  6. 个人工作记录---工作中遇到的sql查询语句解析

    在工作中写了人生的第一个查询语句,虽然是在原有基础上改的,但仍然学到了不少知识 代码: select distinct m.id, (select z.jianc from model_zuzjg z ...

  7. PHP 关于MongoDB的操作

    <?php header("Content-type:text/html;charset=utf-8"); $m = new MongoClient(); // 连接 $db ...

  8. eval函数:分号的应用

    eval("echo'hello world';"); ("参数;") eval函数把参数当做php代码来执行,参数后要有分号,最后还要另加一个分号 相当于: ...

  9. js以json形式提交数据,后台接受

    $("#savename").click(function(){ var fananname=$("#editname").val(); var jsonLis ...

  10. mysql数据库管理备份运维常用命令

    登陆mysql: mysql -u root -p password 远程访问开启((%)表示任何主机连接,可以换固定IP来访问远程连接): GRANT ALL ON *.* TO root@'%' ...