C陷阱与缺陷读书笔记(一)

第一章

1.2   按位运算符:&                        逻辑运算符:&&

1.3   单字符符号:只有一个字符长              多字符符号:含多个字符

        贪心法,大嘴法:一个字符一个字符读入,如果该字符可能组成一个符号,那么再读下一个字符,判断已经读入的两个字符组成的字符串能否组成一个(多字符)符号的一部分,如果可以,继续读下一个字符,重复上述判断,直到读入的字符已不再可能组成一个有意义的符号。

        eg:  y = x/*p   /*编译器将这里视为y=x,后面的为注释*/

                 应当更改为  y = x /(*p);

1.5 字符与字符串:

      字符:用单引号引起的一个字符实际代表一个整数,该整数值对应于该字符在编译器采用的字符集中的序列值。

      字符串:双引号引起,代表一个指向无名数组起始字符的指针。该数组被双引号之间的字符以及一个额外的二进制为0的字符'\0‘初始化。

第二章

2.1 理解函数声明

    根本原则:声明一个给定类型的变量,将声明中的变量名和末尾的分号去掉,将剩余部分括号括起来,可得到该类型的类型转换符。

     

float (*h)();    //h是一个指向返回值为浮点类型的指针
float (*)()      //表示一个“指向返回值为浮点类型的函数的指针”的类型转换符

假设fp为一个函数指针,则可以 (*fp)()调用该指针指向的函数。

则调用首地址为0位置的子例程,可以写作:(*0)();

但必须将0做类型转换,因为*必须作用一个一个指针(这里该指针必须为函数指针)

void (*fp)();  //声明一个指向返回值为void类型的函数的指针
void (*)()     //根据之前的原则,这样得到一个“指向返回值为void类型的函数的指针”的类型

因此对0类型转换的结果为:

(void (*)())0

因此调用首地址为0的子例程为:

(*(void(*)())0)();

思考:

void (*signal(int,void(*)(int)))(int);
//声明了一个signal函数

简化表达:
typedef void (*HANDLER)(int);  //定义HANDLER为一种函数指针类型
HANDLER signal(int, HANDLER);  //signal为一个形参:整型,函数指针   返回值:函数指针
                               //该函数指针指向一个参数为int,返回值为void的函数

附:关于typedef的思考

 typedef int *apple; 理解它的正确步骤是这样的:先别看typedef,就剩下int *apple; 这个语句声明了一个指向整型变量的指针apple (注意:定义只是一种特殊的声明),加上typedef之后就解释成声明了一种指向整型变量指针的类型apple 。

猜你喜欢

转载自www.cnblogs.com/dzy521/p/9383820.html