C primer plus 读书笔记第十四章

这一章主要介绍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");

    return 0;
}

  这个示例代码展示了如何建立结构声明:并没有创建一个实际的数据对象,而是描述了组成这类对象的元素(类似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)
{
    struct guy fellow[2] =
    {
        {{"Ewen", "Villard"},
        "grilled salmon",
        "personality coach",
        58112.0
        },

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

    struct guy * him; /* 这是一个指向结构的指针 */
    printf ("address #1: %p #2: %p\n", &fellow[0], &fellow[1]);
    him = &fellow[0];
    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++;
    printf ("him->favfood is %s: him->handle.last is %s\n", him->favfood, him->handle.last);
    return 0;

}

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

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

 

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

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

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

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

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

时间: 2024-09-29 03:23:16

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

《C++ Primer》读书笔记—第十六章 模板与泛型编程

---恢复内容开始--- 声明: 文中内容收集整理自<C++ Primer 中文版 (第5版)>,版权归原书所有. 学习一门程序设计语言最好的方法就是练习编程 1.面向对象编程和泛型编程都是处理在编写程序时不知道类型的情况,不同之处在于,OOP能处理类型在程序运行之前都未知的情况,而在泛型编程中,在编译时就能获知类型了. 2.泛型编程与面向对象编程一样,都依赖于某种形式的多态性.面向对象编程中的多态性在运行时应用于存在继承关系的类. 3.在泛型编程中,我们所编写的类和函数能够多态地用于跨越编译

C primer plus 读书笔记第十二章

C的强大功能之一在于它允许我们控制程序的细节.C的内存管理系统正是这种控制能力的例子.它通过让我们决定哪些函数知道哪些变量以及一个变量在程序中存在多长时间来实现这些控制. 1.存储类及其说明符 主要的定义:作用域.链接以及存储时间.其他编程语言也有类似的概念.C语言通过这三个概念定义了5中存储类.其说明符分别为auto.register.static.extern和typedef. 2.存储类和函数 函数也分为外部的和静态的.关键字是extern和static.默认情况下是外部的. 3.mall

算法导论读书笔记-第十四章-数据结构的扩张

算法导论第14章 数据结构的扩张 一些工程应用需要的只是标准数据结构, 但也有许多其他的应用需要对现有数据结构进行少许的创新和改造, 但是只在很少情况下需要创造出全新类型的数据结构, 更经常的是通过存储额外信息的方法来扩张一种标准的数据结构, 然后对这种数据结构编写新的操作来支持所需要的应用. 但是对数据结构的扩张并不总是简单直接的, 因为新的信息必须要能被该数据结构上的常规操作更新和维护. 14.1 动态顺序统计 顺序统计树(order-static tree) : 在红黑树的基础上, 在每个

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

第十四章.迭代器模式 迭代器模式,又叫做游标模式,是行为型设计模式之一.我们知道对容器对象的访问必然会涉及遍历算法,我们可以将遍历的方法封装在容器中,或者不提供遍历方法,让使用容器的人自己去实现去吧.这两种情况好像都能够解决问题. 然而在前一种情况,容器承受了过多的功能,它不仅要负责自己"容器"内的元素维护(添加.删除等等),而且还要提供遍历自身的接口:而且由于遍历状态保存的问题,不能对同一个容器对象同时进行多个遍历.第二种方式倒是省事,却又将容器的内部细节暴露无遗. 正因于此,迭代器

Hadoop读书笔记(十四)MapReduce中TopK算法(Top100算法)

Hadoop读书笔记系列文章:http://blog.csdn.net/caicongyang/article/category/2166855 (系列文章会逐步修整完成,添加数据文件格式预计相关注释) 1.说明: 从给定的文件中的找到最大的100个值,给定的数据文件格式如下: 533 16565 17800 2929 11374 9826 6852 20679 18224 21222 8227 5336 912 29525 3382 2100 10673 12284 31634 27405 1

【读书笔记】第四章 瞬时响应:网站的高性能架构

第四章 瞬时响应:网站的高性能架构 4.1 网站性能测试 4.1.1 不同视角下的网站性能 1.用户角度:网站响应速度快还是慢2.开发人员:关注系统本身及其子系统的性能,响应时间,吞吐量,并发能力,稳定性等指标.3.运维人员:关注基础设施和资源利用率,比如贷款能力,服务器配置,数据中心网络架构等. 4.1.2 性能测试指标 1.响应时间 下表是一些常用的系统操作所需要的响应时间 2.并发数:系统能够同时处理的请求数目3.吞吐量:单位时间内,系统处理的请求数量(注意与并发数区分).TPS(每秒事务

读书笔记(十四)——作业的知识点与注意事项

1. SQL Server 代理中包含很多的类别,有作业.警报.操作员.代理等,作业属于其中的一个类别 1. 用自动化数据备份来介绍作业的具体运用规则 ①用命令符启用sqlserveragent ②添加作业的类别,明确进行作业的任务 EXEC msdb.dbo.sp_add_category @class = 'JOB'--添加对象的类别,如:作业.报警 ,@name = 'ct_药房管理系统_Maintain'; ---设置类别的名字 ③添加作业(包括名字.任务,所属的类别) EXEC msd

计算机科学丛书:数据库系统概念 读书笔记(十四)--事务

构成单一逻辑工作单元的操作集合称作事务(transaction). 即使有故障,数据库系统也必须保证事务的正确执行--要么执行整个事务,要么属于该事务的操作一个也不执行. 1. 事务概念 事务通常由高级数据操纵语言或编程语言通过JDBC或ODBC嵌入式数据库访问书写的用户程序的执行所引起. 四大特性:原子性.隔离性.一致性.持久性 原子性:如果一个事务开始执行,但是由于某些原因失败,则事务对数据库造成的任何可能的修改都要撤销.无论事务本身是否失败,或者操作系统崩溃,或者计算机停止运行,这项操作都

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

主要内容: 块设备简介 内核访问块设备的方法 内核I/O调度程序 1. 块设备简介 I/O设备主要有2类: 字符设备:只能顺序读写设备中的内容,比如 串口设备,键盘 块设备:能够随机读写设备中的内容,比如 硬盘,U盘 字符设备由于只能顺序访问,所以应用场景也不多,这篇文章主要讨论块设备. 块设备是随机访问的,所以块设备在不同的应用场景中存在很大的优化空间. 块设备中最重要的一个概念就是块设备的最小寻址单元. 块设备的最小寻址单元就是扇区,扇区的大小是2的整数倍,一般是 512字节. 扇区是物理上