提问:
1.什么是联合体?
2.变量名和变量值区别是什么?
3.数据变量有哪些?
4.局部变量和全局变量?
5.有哪些基本内置类型?
6.static是什么?
7.extern是什么?
8.const是什么?
9.typedef是什么?
10.枚举与#define的区别?
答
1.联合体
1)联合体是一个结构;
2)它的所有成员相对于基地址的偏移量都为0;
3)此结构空间要大到足够容纳最"宽"的成员;
4)其对齐方式要适合其中所有的成员;
2.变量名是在变量的声明的时候,该名字就和内存中一块地址绑定在一起了。可以通过变量名直接找到对应的内存区域,也可以通过地址找到其内存区域。
变量的值是变量所对应的内存区域内存放的二进制序列。变量的值不会因为变量的类型发生了改变而改变,当变量被转换为对应类型时,内存区域的二进制序列以该类型的形式翻译出来。这也是强制类型转换能够成立的原因。
该名字就和内存中一块地址绑定在一起了。可以通过变量名直接找到对应的内存区域,也可以通过地址找到其内存区域。
变量的值是变量所对应的内存区域内存放的二进制序列。变量的值不会因为变量的类型发生了改变而改变,当变量被转换为对应类型时,内存区域的二进制序列以该类型的形式翻译出来。这也是强制类型转换能够成立的原因。
3.(1)整型变量 (2)字符型变量 (3)浮点型变量 (4)指针型变量 变量的值可以发生改变,可以被覆盖、被写入、被赋值。每个变量必须有一个名字和它所在内存空间绑定。
代码中明的变量类型已经决定,但其所代表的空间里的数据是可以修改的。
4.局部变量是内部变量,局部变量是在函数内作定义说明的,其作用域仅限于函数内,离开函数后再使用这种变量是非法的。
(1)主函数中定义的变量只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。
(2)形参变量是属于被调用函数的局部变量,实参函数是属于主调函数的局部变量。
(3)允许在不同的函数中使用相同的变量名,代表不同的对象,分配不同的单元,互不干扰,也不发生混淆。
(4)在复合语句中也可定义变量,作用域只在复合语句范围内。
全局变量:也称外部变量,是在函数外部定义的变量,不属于哪一个函数,属于一个源文件,作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明,只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern,但在一个函数之前的全局变量,在该函数内使用可不再加以说明。
5.(1)整型 (2)实型 (3)构造类型
(4)指针类型 (5)枚举类型 (6)void类型
6.static修饰变量,指该变量空间独立于函数中的auto变量或者栈变量,static变量空间在内存中的静态区内分配。
(1)修饰局部变量:一般情况下,局部变量是存放在栈区的,并且局部变量的生命周期在该语句块执行结束时便结束了。但使用static进行修饰的话,该变量便存放在静态数据区,其生命周期一直持续到整个程序执行结束为止。但其作用域并没有改变,仍是一个局部变量,作用域仅限于该语句块。
(2)修饰全局变量:对于一个全局变量,它既可以在本源文件中被访问,也可以在同一个工程的其他源文件中被访问(只需用extern进行声明即可)
(3)修饰函数:情况与修饰全局变量一样,改变了函数的作用域。
Extern指当前变量或函数不是在本源文件内声明的,是外部变量或外部函数,在文件里试图用一个外部声明的全局变量或函数时,可在前加上extern。
7.extern可修饰变量和函数,表示该变量或者函数在其他地方被定义,在此声明使用它,多个源文件共享变量和函数;多个c源文件的编译是独立的,所以编译器无法判断多个源文件共享的变量的类型是否一致;等到链接的时候,多个源文件编译后的.o文件链接成一个目标文件,如果有一个以上源文件对同一个变量进行了初始化,则报错。
8.const关键字的作用主要有以下几点:
(1)可以定义const常量,具有不可变性。
(2)便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。
(3)可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。
(4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。
(5) 为函数重载提供了一个参考。
(6) 可以节省空间,避免不必要的内存分配。
(7) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
9. typedef
(1)常规变量类型定义
(2)指针类型定义
(3)数组类型定义
(4)函数地址说明
(5)函数声明
(6)函数指针
10. 枚举与#define的区别
(1)#define 宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值。
(2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量。
(3) 枚举可以一次定义大量相关的常量,而#define 宏一次只能定义一个。