c 读书笔记

关于C的基本知识:

  • sizeof是关键字,不是函数。
  • signed是正负都有,unsigned从0开始。(写的有点的费解,只因不会插入函数。)
  • case后面只能是整型或字符型的常量(常量表达式当然也行)。
  • 每个case结尾要break一下,最后必须default一下,即使程序真的不需要default处理。
  • 多重循环时,要尽可能的把长的循环放在内部。
  • 在C语言里,几是不加返回值类型限定的函数,就会被编译器认为是返回整型。
  • 全局变量位于静态区,局部变量位于栈内存,new或是malloc的位于堆中,比较灵活。所以return语句不可返回指向“栈内存”的指针,因为该内存在函数体结束时已经被销毁了。
  • const做为修饰只读变量的关键字,在定义的时候并未分配内存,编译器把它们放在符号表中,在程序的运行的过程中只有一份拷贝(修饰的是全局的只读变量,位于静态区),而#define定义的宏常量在内存中有若干个拷贝,#define宏是在预编译的时候被替换的。
  • volatile修饰的变量在每次使用时都必须从内存中取,可以保证对特殊地址的稳定访问。
  • 空struct 也有一个byte.
  • 柔性数组和结构体没什么关系,用sizeof计算大小时不算上柔性数组。
  • struct 和class是可以通用的,区别就是struct默认的属性是public的,而class默认的是private的。
  • union中的所有数据成员共用一个空间,分配一个足够大空间的容纳最大数据成员。
  • enum赋值依次+1,没有就从0开始。
  • extern仅仅是声明,并没有分配内存。
  • 在32位的系统中,不管什么样的指针,大小都是4byte(好像是废话).
  • int *p=NULL;与int *p;*p=NULL;含义是不一样的.尤其是第二个是有问题的,可能会报告一个内存访问错误.
  • 把地址赋值给指针必须强制转换,地址的本质就是一个指针.所以要往内存0x102aab上存入一个整型数0x10可以写:*(int *)0x102aab=0x10;
  • int a[4]:a与&a的含义是不一样的,尽管数值上相等,前者是数组首元素的地址,后者是数组的首地址.
  • 数组可以存放任何类型的数据,但不能存放函数.
  • 指针和数组没有任何关系,只是访问的形式有些相似,比如:char *p="abcde";现在要访问c,就可以写成:p[2];同样char a[] ="abcde";访问c也可以写成:*(a+2).
  • 对指针进行+1操作,得到的是下一个元素的地址,不是在地址上直接+1,操作的单位应该是"sizeof(A)"(A是指针的类型).
  • int *p[10]  :  指针数组   ; int (*p)[10]  数组指针. 这里的int 修饰的是数组的内容,它没有名字,是一个匿名数组.p中存放的便是数组的首地址.
  • 指针(地址)的强制转换,转换之后类型也就改变了,再"加"操作就不用sizeof了,只是数之间的运算(这里简单的提一下).

 

  • c语言中,当参数是一维数组时,编译器会把它解析成指向数组首元素的指针,所以:        void fun(char a[10]) 与 void fun(char *p) 与 void fun(char a[]) 意义是一样的.

        void fun(char a[3][5] 与 void fun(char (*p)[5]) 与 void fun(char a[][5])是一样的.

  • 无法把指针变量传递给函数,两个办法:用return;使用二级指针(前者会方便一些);
  • (*void(*)()0)() 与 (*char** (*)(char**,char**)0)(char**,char**);
  • 为了避免野指针,定义指针变量的时候要初始化为NULL,用完指针除了要free一下,也要把指针变量的值设置成NULL.
  • 全局变量与static变量保存在静态区.局域变量保存在栈,由malloc或new分配的内存在堆.
  • char *p="abcdef"; p的内存空间是7个byte而不是6个.最后有个结束符"\0".
  • malloc一个就free一个.再把指针设置为NULL.
  • 函数入口处校验指针p是否为空指针.
  1. 来一个问题吧,话说:char a[5][5];char (*p)[4];问的是:&a[4][2]-p[4][3]是多少.(3)

posted on 2012-09-24 21:16  sherkey  阅读(140)  评论(0)    收藏  举报

导航