《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 宏

  

时间: 2024-10-10 12:56:56

《C和指针》读书记录的相关文章

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

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

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

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

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

傻傻的没弄清,字符数组和 字符串 . 第一点:  编译器遇到 双引号" "的时候,主要有一下集中情况: 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

《C专家编程》读书记录

其实,这本书适合没事的时候翻翻,随便打开哪一页,应该都可以看下去的.总体来说,写的比较欢脱,不像<C和指针>和<C陷阱和缺陷>的章节标题那么严肃,有时候还以为自己在看科技杂志.不过,理解书里面的内容反而需要有较高的C语言基础,内容结构比较松散,如果觉得没有逻辑性,可能是语言基础还掌握的不够. 比较喜欢第1章关于C语言的介绍,前世今生什么的. 2015年5月1日  星期五 天气 雨 第1章  C:穿越时空的迷雾 C语言的史前阶段:BCPL->B->New B->早期

读书记录W2

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

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

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

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

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