1.const 最有用之处就是用他来限定函数的形参,这样该函数将不会修改实参指针所指的数据。
2.sizeof(arr[0]) 的写法比sizeof(int)更具有很好的移植性。因为我们可以改数据类型而不用改该表达式。
3.NUL结束一个字符串,NULL空指针。
4.标准C编译器至少允许switch满足257个case,即满足一个“字符“的所有情况。1个8bit位的所有情况
5."a"
"b"
"c",如果不小心漏掉,号,则上下行字符串会自动相连。"abc"
6.加上static,可限制函数的可见性,缺省是全局可见的。
7.int(*func()) () ; 返回一个函数指针
int (*func())[]; 返回一个指向数组的指针
**尽量让一行代码只做一件事情,别复杂了。
8.联合也可以把一个数据解释成2种不同的东西的功效;
union a{ int whole;
struct {char c0, c1, c2 , c3} byte;
}value
9.C语言声明,解读优先级
1.看名字 next
2.看括号 *next 一个指向什么的指针
3.看后最 () 一个指向一个函数的指针,这个函数木有参数。
4.看钱最 * 这个函数返回一个指针。
5.看修饰符 char * const 这个返回指针的类型是char* const类型
如:char * const *( *next) (); 定义一个指针next,next是一个指向没有参数的函数(即函数指针),他的返回值是一个char* const*类型的指针。
char * ( *c[10] ) (int ** p) ; 定义了一个指向数组的指针c,这个数组里面的元素是函数指针,每个元素的参数是(int **p),返回值是char*类型。
=======================================
char *const * (*next) ( );
| return type | function name | parameter list
而 char *const * 类似于:
char * const pA = "abcde";
char * const * pB = &pA;
=======================================
10.typedef 与 define 区别
1.#define int_tmp int int_tmp i; 合法
2.typedef int int_tmp; int_tmp;非法
11.在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而用#define定义的类型则无法保证。
#define int_tmp int* int_tmp a , b ; --->b 则不是指针
typedef char* char_tmp; char_tmp a, b; --------->a,b都是指针
12.typedef 应用在:
数组、结构、指针及函数的组合类型
可移植性
当代码移植不同平台时,要选择正确的类型如short, int , long,我们只要用typedef中进行修改即可了。
1.数组定义申明: my_array[100]; //分配了内存 extern int my_array[]; //描述其他地方创建的 数据
2.动态函数库链接,-lthread --》libthread.so 应该放于右侧。 gcc a.c -lthread
3.要小心定义的函数名与函数库里面存在相同的函数名。
4.size命令会查看段大小,文本段,数据段,bss段; size a.out
5.calloc是分配清0后的内存块。
6.总线错误:几乎都是由于未对齐的读/写引起的。
7.有限状态机:它的基本思路是用一张表保存所有可能的状态,并列出进入每个状态时可能执行的所有动作,其中最后一个动作就是计算下一个应该进入的状态。
8.数组与指针可互换使用的时机:形参时、表达式内计算时。 不是互换:声明时、定义时
9.pae[2][3]---> pae[0] 他即是元素,也是一个数组的首地址。pae[0]--->[0][1][2]
1.函数库调用/系统调用 区别:
*库函数调用: | 系统调用:
标准C中,C函数库是相同的。 | 各OS的系统调用是不同的。
调库中一个程序 调系统内核的服务
与用户程序相联系 是操作系统的一个进入点
在用户地址空间执行 在内核地址空间执行
属于用户运行时间 属于系统运行时间
过程调用,开销小。 需在用户态与系统内核态切换上下文,开销大
libc中越300个程序 unix中约90个系统调用
** 性能考虑上,应尽量减少系统调用。
2.文件描述符/文件指针有何不同
文件描述符 | 文件指针
他是一个小整数用于存放开放文件的每个进程表| 是一个流结构,它包含流缓冲区,文件数据的变量,buff字节大小流状态
使用它将,程序失去可移植性 标准的I/O制定,文件指针。具备不同系统的可移植性
是文件的每个进程表的偏移量,用于unix系统调用,标识文件 是FILE结构地址,表示开放的I/O流,用于C库I/O库调用,用于标识文件
create() open() read() fopen() fwrite() fread()
3.如何确定一个变量是有符合还是无符号?
无符号的本质是永远不会为负号,有符号的则对最左边一个位取补将全改变它的符号。
#define ISUNISIGNED(a) (a>=0 && ~a>=0)
#define ISUNISIGNED(type) ((type)0-1 > 0)