zoukankan      html  css  js  c++  java
  • C陷阱与缺陷读书笔记(一)

    第一章

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

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

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

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

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

    1.5 字符与字符串:

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

          字符串:双引号引起,代表一个指向无名数组起始字符的指针。该数组被双引号之间的字符以及一个额外的二进制为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 。

  • 相关阅读:
    Something broke! (Error 500)——reviewboard
    linux内核--自旋锁的理解
    I.MX6 mkuserimg.sh hacking
    I.MX6 DNS 查看、修改方法
    I.MX6 android mkuserimg.sh
    I.MX6 AW-NB177NF wifi HAL 调试修改
    I.MX6 wpa_supplicant_8 编译问题
    I.MX6 MAC Address hacking
    I.MX6 MAC地址修改
    I.MX6 U-boot imxotp MAC address 写入
  • 原文地址:https://www.cnblogs.com/dzy521/p/9383820.html
Copyright © 2011-2022 走看看