C专家编程学习笔记——第二章:语言特性

1. sizeof()

sizeof()的返回值是 无符号数;
当操作数是个类型名时,两边必须加上括号(这常常使人误认为它是个函数),但当操作数是变量时就不必加括号。如:
       p = N * sizeof  *q;    //第一个“*”表示乘号,第二个表示“取指针所指向的值”

2.  ANSI C的“maximal much strategy ”(最大一口策略)

——下一个标记有超过一种的解释方案时,编译器将选择能组成最长字符序列的方案。即:z = y+++x 解释为:z = y++  +x

3. 需要返回函数内部定义的局部数组变量的解决方案

①返回一个指向字符串常量的指针。例如:
  char *  func() { return “Only works for simple strings”; }
   如果字符串存储于只读内存区但以后需要改写它,这种方法将不可行。
②使用全局声明的数组。
   缺点:任何人都可能在任何时候修改这个全局数组,而且该函数的下一次调用也会覆盖该数组的内容。
③使用静态数组。
  
char * func( c ) {
           static char buffer[ 20 ];
           ……
           return s;
   }
  
这种方式可以防止任何人修改这个数组,只有拥有指向该数组的指针的程序才能修改这个静态数组。
   但是,该函数的下一次调用将覆盖这个数组的内容,所以调用者必须在此之前使用或备份该静态数组的值。
④显示分配一些内存,保存返回的值。
  
char * func( c ) {
           char *s = malloc( 120 );
           ……
           return s;
   }
  
优点:每次调用时都创建一个新的缓冲区,所以调用该函数不会覆盖以前的返回值,它适用于多线程时的代码。
   缺点:内存的管理比较麻烦。
也许最好的解决方案是要求调用者分配内存来保存函数的返回值。为提高安全性,调用者应该同时指定缓冲区的大小。
  
void func( char * result,  int size ) {
         ……
         strncpy( result, “That`d be in the data segment, Bob”, size );
   }
  
   buffer = malloc( size );
   func( buffer, size );
   ……
   free( buffer );
  
优点:可以在同一块代码段进行内存管理。

4. C语言中函数参数的计算顺序是不确定的。

你可能感兴趣的:(C专家编程学习笔记——第二章:语言特性)