Linux C编程第二章的10个问题以及解决方案
2017-10-07 19:27
232 查看
1、什么是变量名以及强制类型转换能够成立的原因?
变量名是在变量声明的时候,该名字就和内存中一块地址绑定在一起了。可以通过变量名直接找到对应的内存区域,也可以通过地址找到其内存区域。
变量的值是变量所对应的内存区域内存放的二进制序列,变量的值不会因为变量的类型发生了改变而变化,当变量被转化为对应类型时,内存区域的二进制序列以该类型的形式翻译出来,这也是强制类型转换能够成立的原因。
2、什么是全局变量和局部变量?
局部变量亦称内部变量,是在函数内部定义的变量,其作用域只限于函数内部,离开函数后使用该变量即为非法。
全局变量亦称外部变量,是在函数外定义的变量,其作用域在整个源程序内,在函数内部使用全局变量一般应做全局变量的说明,说明符为extern,若在函数前定义了全局变量,在函数内使用时可不加以说明。
3、常量中分为直接常量和符号常量,二者有什么区别?
直接常量为字面常量,就是我们通常见到的各种数字,表达式等,代表一个明确的数值。符号常量,如宏定义中#define,就是仅仅把一个字符串形式赋给变量,该字符串可以是任何形式,但不能参与任何运算,例如3*3,它不是9,而仅仅是3*3,在函数中参与运算时要注意优先级。
4、Auto,register,extern,static使用有什么区别
对于auto变量:是函数中的局部变量,动态地分配存储空间,数据存储在动态存储区中,在调用该函数时系统会给他们分配存储空间,在函数调用结束时就自动释放这些存储空间
对于register变量:为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,只有局部自动变量和形式参数可以作为寄存器变量
对于extern变量:外部变量是在函数的外部定义的,它的作用域从变量定义处开始,到本程序文件的结尾,如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终
对于static变量:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放
5、声明和定义的区别?
定义就是将一个变量名匹配到一个固定的内存空间,定义只能被定义一次。
声明是提前告知编译器该变量已经匹配到相应的一块内存上了,其定义可能在其他地方,声明可以出现多次。
6、什么是联合体?
联合与结构相似,在结构中各成员有各自的空间,一格结构变量的总长度是各成员长度之和。在联合中,各成员共享一段内存空间,联合变量的长度等于各成员中最长的长度。联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。
7、联合体变量如何赋值和使用
对联合体变量的赋值,使用都只能是对变量的成员进行
联合变量的成员表示为:联合变量名.成员名
不允许只用联合变量名作赋值或其它操作,也不允许对联合变量作初始化赋值,赋值只能在程序中进行
一个联合体变量,每次只能赋予一个成员值。一个联合体变量的值就是联合变量的某一个成员值
8、typedef
的作用是什么?
typedef主要用来给变量一个易记且意义明确的新名字和简化一些比较复杂的类型声明。
用法:在通常定义和声明的格式前加上typedef,那定义或声明的变量名即为新的类型名。
9、用void表示的数据类型有两种相反的意思,如何区分?
void 数据类型对立面,即“无类型”,本身不是一种数据类型,使用如下:
(1)如果函数没有返回值,那么应将其声明为void类型
(2)如果函数无参数,那么声明函数参数为void
void * 通用类型指针,可以指向任何类型数据,例:void *pVoid;float *pFloat; pVoid=*pFloat;//正确。无需强制转型(任何类型的指针都可以直接赋值给void*[赋值给其它类型,需要强转])
10、宏定义与const常量定义之间有什么区别
define是宏定义,程序在预处理阶段将用define定义的内容进行了替换,因此程序运行时,常量表中没有用define定义的常量,系统不为它分配内存;const定义的常量,在程序运行时在常量表中,系统为它分配内存。
define定义的常量,预处理时直接进行了替换,所以编译时不能进行数据类型检验;const定义的常量,在编译时进行严格的类型检验,可以避免出错。
define 定义表达式时要注意“边缘效应”。
变量名是在变量声明的时候,该名字就和内存中一块地址绑定在一起了。可以通过变量名直接找到对应的内存区域,也可以通过地址找到其内存区域。
变量的值是变量所对应的内存区域内存放的二进制序列,变量的值不会因为变量的类型发生了改变而变化,当变量被转化为对应类型时,内存区域的二进制序列以该类型的形式翻译出来,这也是强制类型转换能够成立的原因。
2、什么是全局变量和局部变量?
局部变量亦称内部变量,是在函数内部定义的变量,其作用域只限于函数内部,离开函数后使用该变量即为非法。
全局变量亦称外部变量,是在函数外定义的变量,其作用域在整个源程序内,在函数内部使用全局变量一般应做全局变量的说明,说明符为extern,若在函数前定义了全局变量,在函数内使用时可不加以说明。
3、常量中分为直接常量和符号常量,二者有什么区别?
直接常量为字面常量,就是我们通常见到的各种数字,表达式等,代表一个明确的数值。符号常量,如宏定义中#define,就是仅仅把一个字符串形式赋给变量,该字符串可以是任何形式,但不能参与任何运算,例如3*3,它不是9,而仅仅是3*3,在函数中参与运算时要注意优先级。
4、Auto,register,extern,static使用有什么区别
对于auto变量:是函数中的局部变量,动态地分配存储空间,数据存储在动态存储区中,在调用该函数时系统会给他们分配存储空间,在函数调用结束时就自动释放这些存储空间
对于register变量:为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,只有局部自动变量和形式参数可以作为寄存器变量
对于extern变量:外部变量是在函数的外部定义的,它的作用域从变量定义处开始,到本程序文件的结尾,如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终
对于static变量:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放
5、声明和定义的区别?
定义就是将一个变量名匹配到一个固定的内存空间,定义只能被定义一次。
声明是提前告知编译器该变量已经匹配到相应的一块内存上了,其定义可能在其他地方,声明可以出现多次。
6、什么是联合体?
联合与结构相似,在结构中各成员有各自的空间,一格结构变量的总长度是各成员长度之和。在联合中,各成员共享一段内存空间,联合变量的长度等于各成员中最长的长度。联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。
7、联合体变量如何赋值和使用
对联合体变量的赋值,使用都只能是对变量的成员进行
联合变量的成员表示为:联合变量名.成员名
不允许只用联合变量名作赋值或其它操作,也不允许对联合变量作初始化赋值,赋值只能在程序中进行
一个联合体变量,每次只能赋予一个成员值。一个联合体变量的值就是联合变量的某一个成员值
8、typedef
的作用是什么?
typedef主要用来给变量一个易记且意义明确的新名字和简化一些比较复杂的类型声明。
用法:在通常定义和声明的格式前加上typedef,那定义或声明的变量名即为新的类型名。
9、用void表示的数据类型有两种相反的意思,如何区分?
void 数据类型对立面,即“无类型”,本身不是一种数据类型,使用如下:
(1)如果函数没有返回值,那么应将其声明为void类型
(2)如果函数无参数,那么声明函数参数为void
void * 通用类型指针,可以指向任何类型数据,例:void *pVoid;float *pFloat; pVoid=*pFloat;//正确。无需强制转型(任何类型的指针都可以直接赋值给void*[赋值给其它类型,需要强转])
10、宏定义与const常量定义之间有什么区别
define是宏定义,程序在预处理阶段将用define定义的内容进行了替换,因此程序运行时,常量表中没有用define定义的常量,系统不为它分配内存;const定义的常量,在程序运行时在常量表中,系统为它分配内存。
define定义的常量,预处理时直接进行了替换,所以编译时不能进行数据类型检验;const定义的常量,在编译时进行严格的类型检验,可以避免出错。
define 定义表达式时要注意“边缘效应”。
相关文章推荐
- Linux C编程第三章的10个问题以及解决方案
- Linux C编程第四章的10个问题以及解决方案
- es配置项解释以及脑裂问题的解决方案
- Ubuntu 安装PHP的LDAP扩展时遇到的问题以及解决方案
- es配置项解释以及脑裂问题的解决方案
- ASP.NET实现Excel导入SQL数据库以及各种出现的问题解决方案
- 数据库并发操作带来的问题以及解决方案
- 编译时常出现缺少库的问题以及解决方案
- nagios 安装与配置以及遇到一些问题的解决方案
- 带cookie跨域问题的思路以及echo的解决方案
- linux+nginx+mysql+php安装 以及常见问题得解决方案
- OGRE1.9遇到问题以及解决方案
- 微信支付开发中遇到的问题以及注意事项和解决方案
- C#中DES加密解密问题、压缩解压缩文件、进度条以及WinForm中使用控制台的解决方案
- windows2003中IIS6的session以及application在iframe中丢失问题的解决方案
- linux下模拟实现sleep以及sleep会出现的问题解决方案
- 中国省份按照拼音排序出现的问题以及临时解决方案
- dom4j 的 DTD 验证,以及输出乱码问题解决方案