博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言知识点
阅读量:5847 次
发布时间:2019-06-18

本文共 2027 字,大约阅读时间需要 6 分钟。

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

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

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

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

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

还有'\0',这也不是空指针所指的内容. '\0'是表示一个字符串的结尾而已,并不是NULL的意思.
真正的空指针是说,这个指针没有指向一块有意义的内存,比如说:
char* k;
这里这个k就叫空指针.我们并未让它指向任意地点.
又或者
char* k = NULL;
这里这个k也叫空指针,因为它指向NULL 也就是0,注意是整数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
 int main()  {
    int a=0x5678ff07;     printf("%x\n",a);     short b=(short)a;     printf("%x\n",b);     return 0;  }  short b 默认为signed,由于为16位 ,截取后16位,舍弃高16位,则为ff07,最高位为1,所以为负数,            最高位会补齐,由于是负数,以1补齐,就变成了ffffff07,所以你只要定义为            unsigned short 才能保证转换后的数据为16位。 在上述例子中,尽管b是16位有符号数,但是经过转换后高16位均补齐了符号位1,所以仍然将b打印输出为32位数据。 在实际应用中,尽量保证转换后的数据为无符号数,最好是转换前后均为无符号数,这样可以减少一些错误转换。

转载于:https://www.cnblogs.com/King-Gentleman/p/4589903.html

你可能感兴趣的文章
每天一个linux命令(3):pwd命令
查看>>
google重定向错误问题
查看>>
Sublime3 快捷键
查看>>
apache压力测试(性能及监控)
查看>>
列出所有子集-----字典顺序 2013年1月14日
查看>>
定制个人的todo list
查看>>
Python+sklearn使用线性回归算法预测儿童身高
查看>>
记一次与自动论坛发帖机的斗争
查看>>
恢复Reflector反编译后资源文件的办法
查看>>
HandlerExceptionResolver异常解析器家族揭秘
查看>>
Red Hat Linux4.0下主DNS服务器的搭建
查看>>
https/443安装
查看>>
Web服务器压力测试工具http_load、webbench、ab、Siege使用教程
查看>>
我的友情链接
查看>>
RHEL6.3 源码安装Puppet
查看>>
RSAT for Windows10
查看>>
我的友情链接
查看>>
mybatis 和 hibernate 区别?
查看>>
关于线程耗尽导致请求超时系统假死的思考
查看>>
初级文件系统管理之一
查看>>