第三章
C语言的数据类型
本章讲了数据类型的以下几个方面的内容:
用图表来表明C语言数据类型分类
对基本类型,指针类型,构造类型,以及空类型进行解释说明
讲明常量和变量
对基本数据类型进行详细的介绍
数据类型的转换
3.1 数据类型的分类
本小节主要说明的内容是将数据类型利用图来分类,这样可以很好的看清C语言的数据类型可分为几大类。
3.2 数据类型
本小节主要讲明据类型可分为4大类:
基本类型
指针类型
构造类型
空类型
-
基本数据类型主要包括 :整型、字符型、浮点型(实型)、枚 举。
基本数据类型的定义:基本数据类型主要是进行自我说明的,它 的值不可以在分为其它的类型。 -
指针类型:指针是C语言中比较重要的概念和知识点,它是C语言的特色之一。
指针变量:若有一个变量专门用来存放另一个变量的地址,那就把它称之为指针变量。也就是说,指针变量里存放的是地址,即指针。指针变量的取址类似于整型的取址,但这是两个数据类型是完全不同的两个量,因此不能将这两个数据类型混为一谈。 -
构造数据类型:
构造数据类型是根据已定义的一个或多个数据类型用构造的方法来进行定义的。也就是说,一个构造数据类型的值可分为若干个“成员”或“元素”。每个“成员”都是一个基本数据类型或又是一个构造类型。
在C语言中,构造类型有一下几种:
数组类型(是指将相同的数据类型里的数据,进行逐一的排列,将它们组成一个集 合,将这样的数据类型称之为数组类型)
结构类型
共用体(联合)类型
4. 空类型:
空类型的关键字是void,也可以称之为空参数。将这一个函数调用之后,不用返回任何的参数值。如果返回,返回的参数值为0,我们把这样的数值称之为空参数,它的这种类型称之为空类型。
3.3 常量和变量
常量:在程序执行过程中,其值不能 改变的量,也就是固定的量。
变量:其值可以改变的量可以称之为变量,可以通过赋值来改变其变量的值。
3.3.1 常量和符号常量
- 符号常量:
用标识符 代替一个常量,在C语言中,可以用一个标识符代表一个常量,称为符号常量。 - 符号常量在使用之前必须先定义,其一般形式为:
#define 标识符 常量
其中#define是一条预处理命令(预处理命令都以“#”开头),把这样的预处理命令称之为宏命令,它的功能是把该标识符定义为之后的常量值;标识符一经定义 ,以后在程序中所有出现该标识符的地方均为该常量值。习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。 - 符号常量的使用。
运行结果为:
符号常量与变量不同,它的值在其作用域内不能改变,也不能在被赋值。
使用符号常量的好处是:
含义清楚
能做到“一改全改”(因为常量是一个固定的量,所以可以做到“一改全改”)
3.3.2 变量
变量有以下特征:
- 变量:其值可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的储 存单元。
- 变量定义必须放在变量使用之前,一般放在函数体的开头部分。
- 如何区分变量名和变量值:
eg:int k=3;
k 变量名称
3 变量值
0x0010ff 变量地址 - 变量的定义:
变量的定义即确定变量名在同时确定变量所占据储存空间,对于任何变量必须先定义其变量的数据类型,这个变量只有在定义其数据类型后,才能进行运算。 - 变量初始化: ①在定义变量同时给变量进行一个赋值
②在定义变量之后,再给变量进行赋值
3.4基本数据类型
整型数据
- 整型常量的表示方法
整型常量就是整常数。在C语言中,使用的整常数有八进制,十六进制和十进制三种。
① 十进制整常数:十进制整常数没有前缀。其数码为0-9.
② 八进制整常数:八进制整常数必须以0开头,即以0作为八进制的前缀为0,数码值为0-7.八进制数通常是无符号的。
③ 十六进制整常数:十六进制整常数的前缀为0X或0x。其数码取值为0-9,A-F或a-f。
④ 整常数的后缀:在16字长的机器上,基本整型的长度也为16位,因此表示的数的范围是有限定的。十进制无符号整常数的范围为0-65535,有符号数为-32768-+32767。八进制无符号数的表示范围为0-0177777。十六进制无符号数的表述范围为0X0-0XFFFF或0x0-0xFFFF。如果使用的数超过了上术范围就必须用长整型数来表示。长整型数是后缀“L”或“l”来表示的。 - 整型变量
- 整型数据在内存中的储存方式
eg:int k=3;
k 变量名称
3 变量值
0x0010ff 变量地址
这里的3在内存中是以二进制的形式保存的。 - 内存中的二进制储存(一个字节BYTE=8位bit
- 整型变量分类:
⑤ 基本型:类型说明符为int
⑥ 短整型:类型说明符为short int 或short
⑦ 长整型:类型说明符为long int 或long
⑧ 无符号类型:类型说明符为unsigned
如何测试数据类型在内存中所占的字节数(编译器不同,则在内存中所占的字节数不同)
eg: 测试整型在内存中所占的字节数的方法
这串代码可说明int类型在此编译器中占4个字节。如果测试其他数据类型,可将int切换为其他数据类型的说明符
- 整型变量
1)变量定义的表达方式:
类型说明符 变量名标明符,变量名标识符,…;
eg: int a,b,c;(a,b,c为整型变量)
long x,y;(x,y为长整型变量)
unsigned p,q;(p,q为无符号整型变量)
在书写变量定义时,应注意以下几点:
允许在一个类型说明符后,定义多个相同类型变量,各变量之间必须要用逗号隔开,类型说明符与变量名之间至少要用一个空格间隔。
最后一个变量名之后必须以“;”间隔。
变量定义必须放在变量使用之前。一般放在函数体的开头部分。
整型变量的定义和使用:
整型的溢出:
这样这可以实现数据溢出。
正常的结果应该为32768,由于整型数据的溢出,使结果为-32768。 - 补码:
1)正数的补码与原码相同
2)负数的补码将该数的绝对值的二进制形式按位取反再加1
eg:求-10的补码:
10的原码: 00001010
取反: 11110101
再加1,得-10的补码: 11110110(符号位为1表示负数,为0表示正数)
3.3.3 实型数据
- 实型常量的表示方法:实型也称为浮点型,实型常量也称为实数或者浮点数。
在C语言中,实数值采用十进制。 - 实型常量的两种表达方式:
① 十进制小数形式:由数码0-9和小数点组成(必须有小数点)
② 指数形式:由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以代符号)组成,其一般形式为aEN(a为是十进制数,N为十进制整数,E为阶码)
eg:2.1E5等于2.1105 3.7E-2等于3.710-2 0.5E7等于0.5*107
标准C 允许浮点数使用后缀,后缀为“f”或“F”即表示该数为浮点数,如356f和356是等价的。 - 实型变量
实型数据在内存中的存放形式:实型数据一般占4个字节(32位)内存空间,按指数形式储存。
实数3.14159在内存中的形式如下:
小数部分占的位数愈多,数的有效数值愈多,精度愈高
指数部分占的位数愈多,则能表示的数值范围愈大
4. 实型变量的分类:
实型变量分为:单精度(float型)、双精度(double型)、长双精度(long double型)
5. 实型数据的舍入误差:
由于实型变量是由有限的储存单元组成,因此能提供的有效数字总是有限的。
eg:
3.3.4 字符型数据
- 字符型数据包括字符常量和字符变量
- 字符常量:用单引号括起来的一个字符
- 字符常量的特点:
① 字符常量只能用单引号括起来,不能用双引号或其它括号。
② 字符常量只能是单个字符,不能是字符串。
③ 字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。
如‘5’和5是不同的。‘5’是字符常量,它不能参与运算。 - 字符变量:用来存储字符常量,即单个字符。
- 字符变量的类型说明符为char(字符变量类型定义格式和书写规则都与整型变量相同)。
- 转义字符:是一种特殊的字符常量。转义字符以反斜线“\”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。转义字符是用来表示那些用一般字符不便于表示的控制代码。
常用得到转义字符及其含义
- 转义字符的使用
- 字符数据在内存中的存储形式及使用方法:
每个字符变量被分配一个字符的内存空间,因此只能存放一个字符。字符值是以ASCII码的形式存放在变量的内存单元之中的。
- 字符串常量是由一对双引号括起来的字符序列
- 字符串常量与字符常量是不同的量,它们有以下区别:
① 字符常量由单引号括起来,字符串常量由双引号括起来。
② 字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
③ 可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。
eg:可以char a=‘a’不能char a=“a”
④ 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符“\o”(ASCII码为o)。这是字符串结束的标志。
3.5数据类型的转换
本小节主要讲明C语言数据类行的量种转换的方法:
自动转换
强制转换
- 变量的数据类型是可以转换的。
- 数据类型的转换方式有两种:
① 自动转换
② 强制转换 - 自动转换发生在不同类型的量混合运算时,由编译系统自动完成。
- 自动转换遵循原则:
① 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
② 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int型转换为long型后再进行运算。
③ 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换为double型,再做运算。
④ 当char型和short型参与运算时,必须先转换成int型。 - 自动转换规则:
double<——float<——long<——unsigned<——int<——char,short - 强制类型转换:是通过类型转换运算来实现的
一般形式:(类型说明符)(表达式)
功能:把表达式的运算结果强制转换为类型说明符所表达的类型。
eg:(float)a 把a转换为浮点型(实型)
(int)(x+y)把x+y的结果转换为整型 - 在使用强制转换时应注意一下问题:
① 类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型后再与y相加。
② 无论是强制转换或自动转换,都只是为了本次运算的需要而对变量的数据长度进行临时性转换,而不改变数据说明时对该变量定义的类型。
f虽强制转换为int型,但只在运算中起作用,是临时的,而f本身的类型并不改变。因此,(int)f的值为5删去了小数,而f的值仍为5.75。