第二章 数据类型问题与答案

1.变量,变量名和变量值

变量:其值在作用域内可以改变的量,一个变量应该有一个名字,在内存中占据一定的存储空间。变量在使用前必须要定义,每个变量都有自己的地址。变量依据其定义的类型,分为不同类型,如整型变量、字符型变量、浮点型变量、指针型变量等。变量的值可以发生改变,意味着它可以被覆盖、被写入、被赋值。每个变量必须要有一个名字和它所在内存空间绑定。

变量名是在变展的声明的时候,该名字就和内存中块地址绑定在一起了。可以通过变量名直接找到对应的内存区域,也可以通过地址找到其内存区域。
变量的值是变量所对应的内存区域内存放的二进制序列,变量的值不会因为变量的类型发生了改变而改变,当变量被转换为对应类型时,内存区域的二进制序列以该类型的形式翻译出来。这也是强制类型转换能够成立的原因。

2.局部变量和全局变量

函数形参变量只有在被调用期间才能分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称为变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同其作用城也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。

局部变量:局部变量是在函数内作定义说明的,其作用域仅限在函数内,离开该函数后在使用这种变量是非法的。

关于局部变量的作用域还要说明以下几点。

(1)主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,中场数中也不能使用其他函数中定义的变量。因为主函数也是个函数,它与其他函数是平行关系。这一点是与其他语言不同的,应予以注意。

(2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。

(3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰, 也不会发生混淆。

(4)在复合语向中也可定义变量, 其作用域只在复合语句范围内。

全局变量:全局变量实在函数外部定义的变量,不属于哪一个函数,属于一个源程序文件,其作用域是整个源程序。

3. 基本内置类型

  基本内置类型分为 整型、实型、构造类型、指针类型、枚举类型、void类型。其中构造类型是指若干个相关的数据组合在一起形成的一种复杂数据类型。

类型说明符                                数的范围                                                  字节数

int                                                                                                                  4

unsigned int                              0~ 65535                                                     2

short int                                     -32768-32767                                             2

unsigned short int                     0~ 65535                                                     2

long int                                      -2147483648- 2147483647                        4

unsigned long                           0~4294967295                                            4

char                                           -128~127                                                    1

unsigned char                           0~255                                                          1

 

4. 声明和定义的区别

定义就是(编辑器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字我们经常所说的变量名或对象名。一个变量或对象在一定的区域内(如函数内、全局等)只能被定义一次。

声明: 一.是告诉编译器,这个名字已经匹配到相应的一块内存上了,声明可以出现多次。二.是告诉编译器,这个变量名或对象名已经被预定,别的地方再也不能用它来作为变量名或对象名。

5. static和extern

static:用static修饰局部变量时,其生命周期以及存储空间发生变化,但其作用域并没有变化,作用域仍仅限于该语句块;但用static修饰全局变量时,改变了其作用域的范围,由原来整个工程可见变成本源文件可见。修饰函数时,也是改变其作用域。

extern:外部变量是在函数的外部定义的,它的作用域从变量定义处开始,到本程序文件的结尾,如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终。在写程序时,如果使用extern函数,一定要注意外部函数的参数类型,参数个数和返回值类型,最好保持一致。

6. const

const关键字的作用主要有以下几点:

1、可以定义const常量,具有不可变性。

2、便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。

3、可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。

4、可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。

5、为函数重载提供了一个参考。

7. auto、register 、volatile和typedef

auto:auto的出现意味着当前变量的作用域为当前函数或代码段的局部变量,意味着当前变量会在内存栈上进行分配。

register:一个变量被其修饰,往往意味着该变量会作为一个寄存器变量,寄存器变量是指一个变量直接引用寄存器,也就是对变量名的操作的结果是直接对寄存器进行访问。

volatile:volatile是一个类型修饰符。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

typedef:为C语言的关键字,其作用是为一种数据类型定义一个新名字。在编程中使用typedef目的一般有两个:一个是给变量起个易记且意义明确的的新名字,另一个是简化一些比较复杂的类型声明。

8. 枚举

          enum  enum_type_name

                  {

                          ENUM_CONST_1,

                          ENUM_CONST_2,

                          ......

                          ENUM_CONST_n

                   }enum_variable_name;

enum_type_name:自定义的一种数据类型名

enum_variable_name:枚举变量。

实际上enum_type_name类型是对一个变量取值范围的限定,而花括号内是它的取值范围。

9. 枚举与#define宏的区别:

 1.#define宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值。

 2.一般在编译器里,可以调试枚举常量,但不能调试宏常量。

 3.枚举可以一次定义大量相关的常量,而#define宏一次只能定义一个。

10. 联合体

 定义一个联合类型的一般形式为:

union 联合名

{

     成员表

};

成员的一般形式为:

类型说明符  成员名

联合与结构的区别:在结构中,各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和;而在联合中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值