《C专家编程》读书记录

其实,这本书适合没事的时候翻翻,随便打开哪一页,应该都可以看下去的。总体来说,写的比较欢脱,不像《C和指针》和《C陷阱和缺陷》的章节标题那么严肃,有时候还以为自己在看科技杂志。不过,理解书里面的内容反而需要有较高的C语言基础,内容结构比较松散,如果觉得没有逻辑性,可能是语言基础还掌握的不够。

比较喜欢第1章关于C语言的介绍,前世今生什么的。

2015年5月1日  星期五 天气 雨

第1章  C:穿越时空的迷雾

  • C语言的史前阶段:BCPL->B->New B->早期C
  • C语言的早期体验(评:历史原因造成了现在C语言的一些语言特性)
  • 标准I/O库和C预处理器
  • K&R C

      

  • 今日之ANSI C
  • 它很棒,但符合标准吗:不可移植代码,坏代码,可移植代码
  • 编译限制,ANSI C标准对一个能够成功编译的程序的最小长度做了限制
  • ANSI C标准的结构,与K&R C相比,最重要的新特性就是原型

第2章 这不是Bug,而是语言特性f

  • 编程语言的细节,Fortran语言经典错误,DO 10 I=1.10和DO 10 I=1,10的区别。

    分析编程语言缺陷的一种方法是把所有的缺陷归类为3类:不该做的做了,该做的没做,该做但做的不合适。

  • 多做之过

    • switch语句中的fall through  
    • 相邻字符串常量被自动合并  
    • 太多的缺省可见性,即默认的函数作用域过宽
  • 误做之过,语言中有误导性质或是不适当的特性
    • 重载,许多符号甚至关键字被重载
    • 有些运算符的优先级是错误的(ANSI C标准由于种种历史原因,没有在优先级方面采取措施)
  • 少做之过,语言应该提供但未能提供的特性
    • 空格问题
    • 注释风格
    • 编译器日期被破坏
    • lint程序绝不应该被分离出来,lint程序寻找bug,早用,勤用

第3章 分析C语言的声明

  • 只有编译器才会喜欢的语言,声明
  • 声明如何形成,至少一个类型说明符+有且只有一个声明器+零个或更多声明器+一个分号
  • 优先级规则,括号内的->后缀操作符->前缀操作符,按照这个顺序优先级从高到低
  • 通过图表分析C语言声明
  • typedef可以成为你的朋友,为一种类型引入新名字,而不是为变量分配内存
  • typedef int x[10]和#define x int[10]的区别
    • 可以用其他类型说明对宏类型名进行扩展
#define peach int
unsigned peach i; /*没问题*/
typedef int banana;
unsigned banana i;/*错误,非法*/
    • 连续几个变量声明中,typedef保证所有变量为同一种类,#define定义则无法保证
  • typedef struct foo {..foo;}的含义,不同的命名空间内使用同一个名字,bad habit

第4章 令人震惊的事实,数组和指针并不相同

  • 数组并非指针
  • 我的代码无法运行
  • /*file 1*/
    int mango [100];
    /*file 2*/
    extern int *mango;
  • 什么是声明,什么是定义
    • 声明,描述其他地方创建的对象
    • 定义,确定对象类型并为其分配内存,只能出现在一个地方
  • 使声明和定义匹配,指针的外部声明与数组不匹配,代码当然没办法运行
  • 指针和数组的区别
指针 数组
保存数据的地址 保存数据

间接访问数据,首先取指针内容,把它作为地址,然后从这个地址取地址。如果指针有一个下标[I],就把指针的内容加上I作为地址,从中提取数据

直接访问数据,a[I]只是简单的以a+I为地址取得数据
通常用于动态数据结构 通常用于存储固定数目且数据类型相同的元素
相关的函数为malloc().free() 隐式分配和删除
通常指向匿名数据 自身即为数据名
时间: 2024-10-10 08:44:20

《C专家编程》读书记录的相关文章

《C和指针》读书记录

2015年4月23日 星期四 第3章  数据 基本数据类型,整型,浮点型,指针,聚合类型 基本声明,  初始化声明,数组声明,声明指针,隐式声明 typedef与#define区别 常量,指针常量,常量指针 作用域,4类,文件作用域,函数作用域,代码作用域,原型作用域 连接属性,3种,内部,外部,无 存储类型,普通内存,运行时堆栈,硬件寄存器 static关键字 作用域+存储类型 第4章  语句 空语句,分号 表达式语句,x=y+3;a++; 代码块,{} if语句,if(exp){} whil

<C和指针---读书笔记11>

对于构成字符串的,string.h封装了许多现成的函数以供使用. 字符串,不论是常量字符串还是借用数组尾缀'\0'.  这个strings.h里面的函数都是针对的字符串. 即以'\0'做为截至. 如果你不幸的对 char数组操作,可能得到的结果并不是你想要的结果. strlen函数  unsigned int  strlen (char const *string) 参数列表: 是一个指针或者数组名即可. 返回值:  返回一个无符号数.  如果两个返回值进行比较大小,可以使用  strlen(

<C和指针---读书笔记9>

二维数组 声明和初始化: Type  数组名[m][n] : 声明了一个二维数组. Int  matrix[3][4] = { { 00, 01, 02, 03} , { 10, 11, 12, 13} , { 20, 21, 22, 23} } 视角分析: 二维数组可以看成一个数组:只不过这个数组由复杂元素组成. Int   matrix[3][4] = {?, ?, ?} ,复杂元素?是一个数组. 存储方式: 编译器遇到二维数组的声明时,会为其分配一段空间,顺序如图. 并记录下来, matr

<C和指针---读书笔记10>

傻傻的没弄清,字符数组和 字符串 . 第一点:  编译器遇到 双引号" "的时候,主要有一下集中情况: char str[] = " abc"  :  不指定长度. char str[2] = "abc" :  长度过短. char str[3] = "abc" : 长度恰好, char str[4] = "abc" :   长度恰好 多出1 char str[6] = "abc"  :

《C++ Primer》读书记录五

2015年6月9日  星期二 22:09 第五部分  高级主题 第17章~第18章 第17章 用于大型程序的工具 异常处理,C++的异常处理中,需要由问题检测部分抛出一个对象给处理代码,通过这个对象的类型和内容,两个部分能够就出现了什么错误进行通信 抛出类类型的异常,异常是通过throw对象而引发raise的.该对象的类型决定应该激活那个处理代码.被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位最近的那个.抛出指针通常是个坏主意,抛出指针要求在对于处理代码存在的任意地方存在指针所指向的对

《C++ Primer》读书记录

2015年5月11日 星期一 19:59 第1章 快速入门 第一部分 基本语言 第2章~第8章 第2章 变量和基本类型 基本内置类型,整型(整数,字符和布尔值),浮点型(float,double,long double),有符号/无符号类型 字面值常量 变量,左值和右值 变量名,定义对象,变量初始化规则 声明和定义 名字的作用域 const限定符,只读类型,而不是英文单词常量的意思. 引用,引用和指针的区别? typedef 枚举 类类型 第3章 标准库类型 命名空间的using声明 标准库st

读书记录W2

在过去的两周中,我抽空读完了邹欣老师的<构建之法>第二章 个人技术和流程.在前一章中,大多是关于软件工程这门学科的基本概念与介绍,而在这一章内容则是介绍软件开发过程中的必要测试和流程.由于邹老师举例用的C#语言并没有学过,在阅读这章内容中,带给我不少麻烦. 绝大部分软件都是由多人合作完成的,大家的工作互相有依赖关系.单元测试是一种可以让自己负责的模块功能定义尽量明确,使得模块内部的改变不会影响其他模块,而且模块的质量可以得到稳定的.量化的保证. "// TODO:"一般这样

C和指针——读书笔记(二)

最近频繁地用到数组,又看了<C和指针>数组这一章,所以决定写一些东西,分享一下. 提到数组,很多人都会提到指针.在C语言中,数组名是一个指针常量(意味着你不能修改此常量的值).为什么呢?我们想一下,数组名,是数组首元素的地址,也就是内存中数组的起始位置.如果修改这个指针常量,唯一可行的就是把整个数组移动到内存中的其他位置.但是在程序完成连接后,内存中数组的位置已经固定了,所以再移动就为时已晚了. 一.一维数组 void func1(int* a) { printf("一维数组分析\n

&lt;C和指针---读书笔记13&gt;

结构变量用作函数参数 结构变量做为一种变量类型,完全可以用于函数参数.如果直接把 结构名做为参数,那么根据传值特性,函数调用时, 会为其开辟一部分内存单元,并完成copy值的传递.如果结构变量很庞大,就会很浪费. 还有一种方式,函数参数是: 一个指向struct的指针.这样在函数体内,我们可以使用 px->成员来进行访问. 此时实参--->形参只需要传递一个指针变量,大幅缩小.但我们知道,传递指针有一个坏处,就是函数体内 若修改成员内容,就会真实的反馈到 实参中.需要特别注意. 实参和形参 实