• C语言知识点


    一、C语言可以在不同的源文件中定义相同名字的全局变量吗?

      不使用static的时候,两个不同的源文件都可以正常编译,但会出现链接错误,原因是有两个地方存在相同的变量,导致编译器无法识别应该使用哪一个。

      使用static的时候,你所定义的static变量,编译的时候编译器会将其重新命名,其他文件就不会使用到这个文件的static变量了,这样就使得只在本文件内有效。

    二、C语言中 void *指针与空指针区别?

      void* 这不叫空指针,这叫无确切类型指针.这个指针指向一块内存,却没有告诉程序该用何种方式来解释这片内存.所以这种类型的指针不能直接进行取内容的操作.必须先转成别的类型的指针才可以把内容解释出来.

    还有'',这也不是空指针所指的内容. ''是表示一个字符串的结尾而已,并不是NULL的意思.

    真正的空指针是说,这个指针没有指向一块有意义的内存,比如说:
    char* k;
    这里这个k就叫空指针.我们并未让它指向任意地点.
    又或者
    char* k = NULL;
    这里这个k也叫空指针,因为它指向NULL 也就是0,注意是整数0,不是''
    一个空指针我们也无法对它进行取内容操作.
    空指针只有在真正指向了一块有意义的内存后,我们才能对它取内容.也就是说要这样
    k = "hello world!";
    这时k就不是空指针了.

    三、C语言中#与##意义?

       ## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。

      #连接符是把传递过来的参数当成字符串进行替代

    四、最好不要在头文件中定义变量

      为了防止多个C文件包含同一头文件而引起的变量重复定义错误,一般不要在头文件中定义变量。使用#ifndef...#define...#endif只是防止了同一C文件中头文件被重复包含(其实本例中只有一个头件,不会存在重复包含的问题),但是无法防止多个C文件包含同一头文件时变量被重复定义。

    由于工程中的每个.c文件都是独立的解释的,即使头文件有
    #ifndef _TEST_H_
    #define _TEST_H_
    ....
    #enfif
    在其他文件中只要包含了global.h就会独立的解释,然后每个.c文件生成独立的标示符。在编译器链接时,就会将工程中所有的符号整合在一起,由于文件中有重名变量,于是就出现了重复定义的错误。

    解决方法
    在.c1文件中声明变量,然后建一个头文件(.h文件)在所有的变量声明前加上extern,注意这里不要对变量进行的初始化。然后在其他需要使用全局变量的.c2文件中包含.h文件。编译器会为.c2生成目标文件,然后链接时,如果该.c2文件使用了全局变量,链接器就会链接到此.c1文件 。

    个人认为解决此类问题有几种办法:
    1.在源文件里定义变量,在其他调用处使用extern
    2.在头文件里使用宏定义

    五、32位数据转换成16位或8位

     转换机制为直接从32位数据中截取低16位或低8位
     若转换前后均为无符号数,则正常转换;
     若转换前为32位有符号数而转换后为无符号数,则转换前的最高位符号位直接丢弃,直接截取低16位或低8位数据;
     若转换前为32位无符号数而转换后为有符号数,则截取的低16位或低8位数据最高位表示符号位并且高16位或高24位会补齐符号位;
     若转换前后均有符号数,则转换前的最高位符号位直接丢弃,截取的低16位或低8位数据最高位表示符号位并且高16位或高24位会补齐符号位。

    当转换后为有符号数时,需特别注意。例如:
    #include<stdio.h>
     int main()
     {
        int a=0x5678ff07;
        printf("%x ",a);
        short b=(short)a;
        printf("%x ",b);
        return 0;
     }
     short b 默认为signed,由于为16位 ,截取后16位,舍弃高16位,则为ff07,最高位为1,所以为负数,
               最高位会补齐,由于是负数,以1补齐,就变成了ffffff07,所以你只要定义为
               unsigned short 才能保证转换后的数据为16位。
    在上述例子中,尽管b是16位有符号数,但是经过转换后高16位均补齐了符号位1,所以仍然将b打印输出为32位数据。
    在实际应用中,尽量保证转换后的数据为无符号数,最好是转换前后均为无符号数,这样可以减少一些错误转换。
  • 相关阅读:
    redis---01
    mysql优化-----索引覆盖
    mysql优化-------Myisam与innodb引擎,索引文件的区别
    mysql优化-----多列索引的左前缀规则
    mysql---列的选取原则
    boogo08---中间件
    goroutine pool,WaitGroup,chan 示例
    Android开发 |常见的内存泄漏问题及解决办法
    Android中FragmentPagerAdapter对Fragment的缓存(二)
    Android中FragmentPagerAdapter对Fragment的缓存(一)
  • 原文地址:https://www.cnblogs.com/King-Gentleman/p/4589903.html
Copyright © 2020-2023  润新知