C语言深度解剖 学习笔记

第一章:关键字
1.register:能接受的变量类型,不能用&
2.static:静态局部变量 :对定义该变量的函数来说,一直存在,可用。对外不可用

              静态全局变量:对本文件或本模块内的任意函数可用。对外不可用
   静态函数:该函数作用域仅限于本文件
3.数据类型:大小可以用sizeof测定
            命名法则
            转换时的精度问题
            存储:源码,反码,补码的问题

  注:当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。
4.if
 a.布尔类型变量与0比较用if(bVal)/if(!bVal)
 b.指针类型变量与0比较用if(p==NULL)/if(p!=NULL)
 c.需要用空语句时用NULL;
5.case语句后必须跟整型或char型的常量或常量表达式,const修饰的是只读变量,因此不行。
6.void 对函数返回值和参数的限定,空类型,可以指向任何类型数据
7.define与const
 define定义的是常量,没有类型,在编译期间进行替换并分别内存
 const定义的是只读变量,具有特别类型,如int,在编译期间不分别内存,只是确定其值
8.const: const int a;
         int const a;
  const int *p;  == int const *p;
  const int * const p;  //p及指向的对象都不可变
  int * const p; //p不可变,指向的 对象可变
  以上定义相同,const修饰在类型符的前面或者后面效果一样。
9.volatile:用它修饰的变量表示可能会不可预测的被改变,编译器不会对该变量的代码进行优化,因此常用该关键字对特殊地址进行访问
10.extern:“外来的”,因此外部文件的变量或者函数时进行的申明。
11.typedef:
  typedef int size;
  typedef int add[10];
         typedef int (*pf) (const char *, const char *);
  去掉定义类型名字(如size,add,pf)后,剩下的就是用来修饰的变量类型,以上3例分别为int,int [10],typedef int (*) (const char *, const char *);
  a.在语句构成上,typedef相当于static,extern等存储类关键字,因此typedef不能与其他存储类关键字共修饰,因为一个变量不能有2种修饰方式。y
  b.typedef char* PSTR
           int mystrcmp(const PSTR,const PSTR)中的PSTR是个类型名,因此const PSTR和PSTR const是一样的。因此只要为指针声明typedef,那么要在最终的typedef名称中加一个const,以确定使得该指针是常量,而不是对象,例如typedef const char
12.struct与class:struct成员默认为public,class成员默认为private
13.union与enum
14. 1,'1',"1"的区别:分别是整型,字符,字符串类型,字符以ASC码形式存储。

 

第二章:符号
      熟悉掌握各运算符及其优先级

 

第三章:预处理
1.#define 宏定义常量或表达式
2.#undef 撤销宏定义
3.条件编译:
 #ifdef(或#ifndef, 或#if)
  ...
 #else
  ...
 #endif
  a.#if后面跟常量
  b.#elif意义与else if同,可进行多种编译选择
3.文件包含:#include
4.内存对齐:
 比如32位处理器,地址访问默认自然边界是4。访问未对齐(不是4的倍数)的内存时,处理器要做2次访问,为了提高程序性能,数据结构尽可能的在自然边界上对齐。如果没有对齐,可能造成2种结果:一是程序运行速度降低,二是系统分配额外的空间来做内存对齐操作,可能会造成程序结果的错误(具体可参考专门的文章)。可用pack关键字调整内存对齐数

 

第四章:指针与数组
      指针数组:int *a[10]; //[]比*优先级高,因此a首先是数组地址,该数组里存放了10个int*类型的指针
      数组指针: int (*a)[10];//首先确定a是指针类型,然后是指向int [10]数组类型的指针
      函数指针:char* (*add)(void);//定义指针add,指向char* (*)(void)类型的函数
      函数指针数组:char* (*add[10])(void);//定义数组add[10],存放10个char* (*)(void)类型的元素
      指针加减法运算:如P+n,P当前地址+sizeof(p)*n,而p指向的类型可以转换,任意类型的指针只占用4bytes
      关于复杂的指针计算,可以用内存布局图来分析

 

第五章:内存管理
 一般程序内存分为三块:静态区,堆,栈(堆栈)
 静态区存放:static变量,全局变量等
        堆:有malloc或new分配的内存,生命周期有free或delete决定
        栈:保存局部变量,其生命周期有函数决定,函数运行结束,该栈销毁
  这里对栈需要说明一下:形参值参进入函数,函数在栈内分配内存copy,因此函数内部使用的是参数的copy,不改变参数本身,但生命周期结束后,栈销毁,只能通过return返回对应的值,如要返回指针,则要注意对应内存是否已经销毁。
注:1.定义指针的同时,一定要初始化,否则可能形成野指针,造成不可预计的错误
    2.free函数用来斩断指针和malloc分配的内存的关系,free后,对应指针没有销毁,指向不确定地址,因此需要重新初始化
如: char *p=(char*)malloc(sizeof(char));
     ...
     free(p);
     p=NULL;

 

第六章:函数
       递归函数

 

第七章:文件结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值