C专家编程笔记

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)










你可能感兴趣的:(C专家编程笔记)