首页 > 其他 > 详细

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

时间:2018-07-28 23:53:09      阅读:203      评论:0      收藏:0      [点我收藏+]

第一章

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 。

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

原文:https://www.cnblogs.com/dzy521/p/9383820.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!