1. 字符是有符号整数还是无符号整数?
无符号整数
2. 什么是变量
其值在其作用域内可改变的量。变量在使用前必须要定义,每个变量都有自己的地址。变量的值是变量所对应的内存区域内存放的二进制序列。变量在内存中存放和其值无关,和其类型相关。
3. 局部变量和全局变量
作用域:形参变量只有在函数内才有效,立开改函数就不能再使用,变量有效性的范围即作用域。
局部变量:在函数内作定义说明,作用域仅限于函数内。
注:(1)主函数中定义的变量只能在主函数中使用,主函数中也不能使用其他函数中定义的变量;
(2)形参变量属于被调函数的局部变量,实参属于主调函数的局部变量;
(3)允许在不同函数中使用相同变量名,它们互不干扰,互不混淆。
全局变量:也称外部变量,在函数外部定义的变量,属于一个源程序文件,作用域为整个源程序。只有在函数内经过说明的全局变量才能使用。全局变量说明符为extern。
4. 定义与声明是什么及两者区别
定义:创建一个对象,为其分配一块内存并取名(即变量名或对象名)。一个变量或对象在一定区域内只能被定义一次。
声明:告诉编译器,名字已匹配至一块内存上。声明可出现多次;告诉编译器,名字已预订,别的地方不能用它来作为变量名或对象名。
5. 联合与结构的区别
结构:各成员有各自的内存空间,一个结构变量的总长度等于各成员长度和。
联合:各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。(共享:该联合变量可被赋予任一成员值,但每次只能赋一种值,赋如新值则冲去旧值。)
6. static作用
static修饰变量指该变量空间独立于函数中的auto变量或栈变量,static变量空间在内存中的静态区内分配。
(1)修饰局部变量
局部变量用static修饰时,该变量便存放在静态数据区,生命周期直至整个程序执行结束。虽然其生命周期和存储空间发生了变化,但作用域没变。对于静态局部变量,若没有进行初始化,整型变量系统会自动对其赋值为0,对于字符数组自动赋值为“\0”。
(2)修饰全局变量
用static对全局变量进行修饰改变了作用域的范围,由原来的整个工程可见变为
本源文件可见
7. extern作用
extern指当前变量或函数不是在本源文件内声明的,是外部变量或外部函数。extern可以修饰变量和函数,该变量或函数在其他地方被定义,在这里声明使用它:多个c源文件的编译是独立的,使用编译器只判断变量名或函数名是否一致;等到链接时,多个源文件编译后的.o文件链接成一个目标文件,若有一个以上源文件对同一个变量进行了初始化则报错。
(1)在任何函数体声明或定义变量时,编译器选择初始化的那个,若没有初始化则
任选其中一个作为定义,但加extern肯定是声明;若不想让其他源文件链接,则需使用static。
在函数体内声明使用其他源文件中定义的变量时必须使用extern,因为在函数体内默认为局部变量。
(2)函数默认是外部的,如果不想让其他源文件链接到,在函数前加static。(注:
为提高程序的可读性,最好不要省略extern。在用extern声明变量时,可以不指定类型。在写程序时要注意外部函数的参数类型、参数个数和返回值类型保持一致。)
8. const作用
(1)关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
(2)通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
(3)合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。
9. volatile作用
volatile修饰的变量表示该变量的值很容易由于外部因素发生改变,请求编译器在每次对变量进行访问时去内存里读取。
10.typedef作用
为一种数据类型定义一个新名字,包括内部数据类型和自定义数据类型。目的为:(1)给变量一个易记且意义明确的新名字;(2)简化复杂类型声明。
11. 枚举
使用方法:enum_type_name类型是对一个变量取值范围的限定,花括号内为取值范围。enum变量类型可以给其中的常量符号赋值,若不赋值则从被赋初值的那个常量开始依次加1;若都没有赋值,从0开始依次递增1。
与#define宏的区别:
(1)#define宏常量在预编译阶段进行简单替换,枚举常量在编译时确定其值。
(2)在编译器里,可调试枚举常量,但不能调试宏常量。
(3)枚举可一次定义大量相关常量,而#define宏一次只能定义一个。