• 《C和指针》读书记录


    2015年4月23日 星期四

     第3章  数据

    • 基本数据类型,整型,浮点型,指针,聚合类型
    • 基本声明,  初始化声明,数组声明,声明指针,隐式声明
    • typedef与#define区别
    • 常量,指针常量,常量指针
    • 作用域,4类,文件作用域,函数作用域,代码作用域,原型作用域
    • 连接属性,3种,内部,外部,无
    • 存储类型,普通内存,运行时堆栈,硬件寄存器
    • static关键字
    • 作用域+存储类型

    第4章  语句

    • 空语句,分号
    • 表达式语句,x=y+3;a++;
    • 代码块,{}
    • if语句,if(exp){}
    • while语句,while(exp){},break和continue
    • for语句,for(初始化;条件判断;控制语句){}
    • do语句,与while语句类似,至少循环一次
    • switch语句,fall through现象。
    • goto

    第5章 操作符和表达式

    • 操作符,算数操作符,移位操作符,位操作符,赋值,单目,关系,逻辑,条件,逗号,下标引用[],函数调用(),结构成员
    • 布尔值,C没有显示布尔类型,用整数来代替
    • 左值和右值
    • 表达式求值

    2015年4月24日 星期五 四体不勤

    第6章 指针

    • 内存和地址
    • 值和类型,32位的值可以使用不同格式解释为不同的类型
    • 指针变量的内容
    • 间接访问操作符,解引用
    • 未初始化和非法的指针
    • NULL指针,解引用前检查指针是否为NULL
    • 指针、间接访问和左值
    • 指针、间接访问和变量
    • 指针常量
    • 指针的指针
    • 指针表达式,理解表达式作为左/右值的含义
    char ch='a';
    char *p=&ch;

       &ch, cp, *cp, &cp, *cp+1, *(cp+1),  ++cp, cp++, *++cp, *cp++,

         ++*cp, (*cp)++, ++*++cp, ++*cp++

    • 实例,字符串长度计算,在一组字符串中查找一个字符
    • 指针运算,同一数组内,关系运算

    第7章 函数

    • 函数定义
    • 函数声明,原型
    • 函数的参数,”传值调用
    • ADT和黑盒,接口
    • 递归和迭代,区别,相关的例子
    • 可变参数列表

    第8章  数组

    • 一维数组

      数组名,下标引用,指针和下标,指针的效率,数组和指针,作为函数参数的数组名,声明数组参数,初始化,不完整的初始化,自动计算数组长度,字符数组的初始化

    char message[]="hello";   /*字符数组初始化*/
    char *message="hello"/*字符串常量*/
    • 二维数组

     存储顺序,数组名,下标,指向数组的指针,作为函数参数的多维数组,数组长度自动计算

    /*函数的声明*/
    void func1(int (*mat)[10]);
    void func2(int mat[][10]);
    
    /*数组的初始化*/
    int matrix[2][3]={100,101,102,110,111,112};
    int two-dimen[3][5]={{00,01,02,03,04},{10,11,12,13,14},{20,21,22,23,24}}
    • 指针数组

       字符串的列表存储:矩阵存储(二维数组),指向字符串常量的指针数组

    2015年4月25日  星期六 天气晴

     life is not all great,keep vigilant.

    第9章 字符串、字符和数组

    • 字符串基础,字符串以位模式为全零的NUL字节结尾,NUL是字符串的终止符,字符长度并不包括NUL字节
    • 字符串长度,头文件string.h,库函数size_t strlen(char const*str)返回的是无符号数
    • 不受限制的字符串函
      /*字符串复制函数原型*/
      char *strcpy(char *dst,const char *src);/*无法解决字符串比dst数组长的问题*/
      
      /*字符串连接函数*/
      char *strcat(char *dst,const char *src);/*与strcpy一样,程序员使用函数前,需要保证数组足以容纳src字符串*/
      
      /*字符串比较函数原型*/
      int strcmp(char const *s1,char const *s2);/*s1<s1,return negative,s1=s2,return 0,s1>s2,return positive*/
    • 长度受限制的字符串函数
      char *strncpy(char *dst,char const *src,size_t len);/*如果src的长度大于len,只有len个字符会被复制到dst,且不会以nul字节结尾*/
      char *strncat(char *dst,char const *src,size_t len);
      int strncmp(char const *s1,char const *s2,size_t len);
    • 字符串查找基础
      /*查找一个字符,使用strchr和strrchr函数,原型如下*/
      char *strchr(char const *str,int ch); /*在str中查找字符ch第一次出现的位置,找到后返回指向改位置的指针*/
      char *strrchr(char const *str,int ch); /*返回指向字符最后一次出现的位置*/
             
      
      /*查找任何几个字符,strpbrk函数查找任何一串字符第一次出现在字符串中的位置*/
      char *strpbrk(char const *str, char const *group);
      char string[20]="hello world";
      char *ans;
      
      ans=strpbrk(string,"aeiou");  //ans所指向的是string+1,即e的位置
      
      
      /*查找一个子串,使用strstr函数,原型如下,在s1中查找s2第一次出现的起始位置*/
      char *strstr(char const *s1,char const *s2);
    • 高级字符串查找

          查找一个字符串前缀,strspn->返回str中连续匹配group中任意字符的字符数,strcspn->返回不与group中字符匹配的字符数

      查找标记,char *strtok(char *str,char const *sep);sep定义了用作分隔符的字符集合

    • 错误信息
      char *strerror(int error_number);
    • 字符操作

      ctype.h头文件,对单独字符的操作

      字符分类操作,转换字符操作

    • 内存操作
      /*与strn带头的函数类似,但它们在遇到NUL字节时并不会停止操作*/
      void *memcpy(void *dst,void  const *src,size_t length);
      void *memnove(void *dst,void  const *src,size_t length);
      void *memcmp(void *dst,void  const *src,size_t length);
      void *memchr(void const *a,int ch,size_t length);
      void *memset(void *a,int ch,size_t length);

    2015年4月26日  星期日  10:30  天气晴

    第10章   结构和联合

    • 结构基础知识

        结构声明,struct tag{member-list}variable-list;

        结构成员,可以是标量,数组,指针和其他结构

        结构成员的直接访问,点操作符(.)访问

        结构成员的间接访问,(->),左边必须为指向结构的指针

        结构的自引用,指针形式,链表和树的结构都使用自引用  

        不完整的声明,结构的初始化

    • 结构、指针和成员

        访问指针,访问结构,访问结构成员,访问指针成员

    • 结构的存储分配 ,边界对齐存储
    • 作为函数参数的结构,传递指针比传参数效率高,“传值调用”
    • 位段,bit field
    • 联合union,变体记录

       联合中成员引用的是内存中相同的位置,初始化初始值必须为联合中的第一个成员

    第11章 动态内存分配

    • 为什么使用动态内存分配, 按需分配,避免浪费
    • malloc和free ,void *malloc(size_t size);  void free(void *pointer);
    • calloc和realloc,clear- allocation,re-allocate
    • 使用动态分配的内存
    • 常见的动态内存错误

        a.忘记检查所请求的内存是否分配成功

        b.操作内存是超出分配内存的边界

        c.内存泄露

    • 内存分配实例?

    第12章 使用结构和指针

    • 链表 linked list,链表的特性和相关操作
    • 单链表  插入,查找,删除,排序等,P244,三个版本优化insert,已代码实现
    • 双链表,重复代码消除,简化插入函数

    2015年4月27日  星期一 13:56 早上误

    第13章  高级指针话题

    • 进一步探讨指向指针的指针
    • 高级声明
      /*搞清楚以下声明的含义*/
      int f;     /* 一个整型变量 */
      int *f;    /* 指向整型的指针 */
      int f(x);  /* 返回值为整型的函数 */
      int *f(x);  /* 声明了一个函数,它的返回值是一个指向整型的指针 */
      int (*f)();  /* 声明了一个函数指针,它所指向的函数返回一个整型 */
      int *(*f)();  /* 声明了一个函数指针,它所指向的函数返回值是一个整型指针 */
      int f[];     /* f是一个整型数组 */
      int *f[];    /* f是一个数组,它的元素类型是指向整型的指针 */
      int f()[];   /* 非法声明,函数只能返回标量值,不能返回数组 */
      int f[]();   /* 非法声明,数组元素必须具有相同的长度 */
      int (*f[])(); /* f是一个数组,数组元素是函数指针,它所指向的函数返回值是一个整型*/
      int *(*f[])(); /*f是一个指针数组,数组元素是函数指针,函数返回值是整型指针*/
    • 函数指针

      两个用途:转换表和作为参数传递给另一个函数

    • 命令行参数
    • 字符串常量

      字符串常量出现在表达式中,它的值是一个指针常量。

         "xyz"+1 表示指向y的指针

      *"xyz"  间接访问结果为x

      "xyz"[2]  的值为z

    第14章 预处理器

    • 预定义符号
    • #define 宏

      #define name stuff

      对数值表达式进行求值的宏定义应该加括号,避免结果与预想有差距。宏与类型无关,但每使用一个,宏定义代码就拷贝一份。

    • 条件编译

      #if consta nt-expression

          statement

      #endif

      与

      #ifdef  symbol

        ……

      #endif    在测试一个符号是否已被定义的功能时是等价的,但#if形式功能更强.

    • 文件包含
      #include <filename> /* 函数库文件包含*/
      
      #include "filename" /*本地文件包含*/

    第15章 输入/输出函数

    • 错误报告,void *perror(char const *message);
    • 终止执行,void exit(int status);
    • 标准I/O函数库
    • ANSI I/O概念,流(文本流,二进制流),文件,标准I/O常量(EOF,FOPEN_MAX,FILENAME_MAX)
    • 流I/O总览,I/O函数处理数据形式:单个字符,文本行和二进制数据
    • 打开流, FILE *fopen(char const *name,char const *mode)
    • 关闭流,int fclose(FILE *f)
    • 字符I/O
      int fgetc(FILE *stream); int fputc(int character,FILE *stream);  /*fgetc和fputc是真正的函数,其他都是通过#define指令定义的宏*/
      int getc(FILE *stream); int putc(int character,FILE *stream);     /*将流作为参数传递给函数*/
      int getchar(void);  int putchar(int character)  /*从标准输入,输出读写字符*/ 
      int ungetc(int character,FILE *stream);  /*撤销字符I/O*/
    • 未格式化的行I/O
    • char *fgets(char *buffer,int buffer_size,FILE *stream);
      char *gets(char *buffer);
      
      int fputs(char const *buffer,FILE *stream);
      int puts(char const *buffer)
    • 格式化的行I/O

        scanf家族:fscanf,scanf,sscanf

        printf家族,fprintf,printf,sprintf

        重点输入格式format

    • 二进制I/O
      /* 读取和写入二进制数据*/
      size_t fread(void *buffer,size_t size,count,FILE *stream);
      size_t fwrite(void *buffer,size_t size,count,FILE *stream);
    • 刷新和定位函数
      int fflush(FILE *stream); /* 把输出缓冲区的数据立即进行物理写入*/
      long ftell(FILE *stream); /*返回流的当前位置*/
      int fseek(FILE *stream, long offset, int from);/* 允许在流中定位*/
    • 改变缓冲方式
      void setbuf(FILE *stream, char *buf);
      int setvbuf(FILE *stream,char *buf, int mode, size_t size);
    • 流错误函数,临时文件,文件操作函数

    2015年4月29日 星期三 19:30

    第16章 标准函数库

    • 整型函数,整型算数,字符串转换,随机数,stdlib.h。
    • 浮点型函数,math.h包含了大部分数学函数声明,返回值及参数大部分为double。三角函数,双曲函数,对数和指数函数,浮点表示形式,幂,底数、顶数、绝对值和余数。
    • 日期和时间函数,time.h,处理器时间,当前日期和时间,日期和时间的转换
    • 非本地跳转,setjump.h,setjmp和longjmp提供一种类似goto语句的机制,但并不局限于一个函数的作用域内。
    • 信号,signal.h,信号名,处理信号(raise函数),信号处理函数(vilatile数据,从信号处理函数返回)。
    • 打印可变参数的列表,stdarg.h用于可变参数列表必须被打印的场合。
    • 执行环境,终止执行,环境,执行系统命令,排序和查找(qsort)<stdlib.h>,断言<assert.h>
    • locale,为了使C语言在全世界范围内通用, 数值和货币格式<locale.h>

    第17章 经典抽象数据类型

      链表(第12章)、堆栈、队列和树等

    • 内存分配,静态数组,动态分配数组和动态链式结构
    • 堆栈

        先进后出,操作(push,pop,top,is_empty,is_full,create,destroy),三种实现方式(静态数组堆栈,动态数组堆栈,链式堆栈)。

    • 队列

        先进先出,操作接口(create_queue,destroy_queue,insert,delete,first,is_empty,if_full)

        静态/动态数组实现(环数组),链式实现队列

        二叉树,二叉搜索树BST,操作(插入,删除,查找节点),树的遍历(前序,中序,后序,层次遍历)

    • 实现的改进

        拥有超过一个的堆栈,拥有超过一种的数据类型,名字冲突,标准数据库的ADT(泛型 genericity)

  • 相关阅读:
    JavaScript replace() 方法
    vs2010注册码 激活方法
    Javascript 返回上一页
    错误:该行已经属于另一个表
    Oracle10g中如何分析响应时间
    Oracle Purge和drop的区别
    Oracle 的 Sql*Plus 常用命令介绍【转】
    如何实现oracle不同版本间数据的导入导出
    如何绑定变量使用
    Oracle PGA 介绍
  • 原文地址:https://www.cnblogs.com/sherPur/p/4545817.html
Copyright © 2020-2023  润新知