1.1.2 数据类型
一个程序应包括数据的描述和动作的描述两方面内容。著名计算机科学家沃思曾提出一个公式:数据结构+算法=程序,可见数据结构在程序中的地位。C语言为用户提供了丰富的数据结构,还允许用户自定义复杂的数据结构。
C语言提供的数据结构是以数据类型形式出现的,C的数据类型划分如图1-1所示。
1. 常量与变量
C语言中数据有常量与变量之分。在程序运行过程中,其值不能改变的量称为常量,其值可以改变的量称为变量。常量可分为不同类型,如整型常量 3,实型常量-1.23,字符型常量‘a’。常量一般能从字面形式判别,也可用一个标识符代表,可用下面形式声明。
例如:
#define PI 3.14 /*定义PI代表常量3.14*/
|
 |
| 图1-1 C语言数据类型划分 |
变量可用下面的形式声明。
如:
int I; /*定义i为整型变量*/
char name; /*定义name为字符型变量*/
|
在C语言中,习惯上用大写字符代表常量,用小写字符代表变量。对于变量,要求“先定义,后使用”。以下分别介绍整型、实型等数据类型。
2. 整型数据
(1) 整型常量
整型变量可分为int、short int、long int和unsigned int、unsigned short、unsigned long等类型,它们表示的数的范围不同。
(2) 整型变量
整型变量可分为基本型、短整型、长整型和无符号型4种,下面给出一个实例。
【代码1-1】
main()
{
int a,b,c;
unsigned d;
a=6;b=-7;u=78;
c=a+b+u;
printf("%d\n",c);/*printf()为格式化输出函数*/
/* "%d"表输出格式为十进制整数*/
}
|
运行结果为:
printf()是标准输出函数,在后面我们将要详细说明。
3. 实型数据
(1) 实型常量
实型常量有两种表示方式,一种为十进制形式,如0.12、36.2;另一种为指数形式,如123e3表示123000。要注意 e 字母之前必须要有数字,e字母后面必须为整数。
(2) 实型变量
实型变量分为单精度(float)和双精度(double)两种,如:
float x ; /*指定x为单精度实数*/
double y ; /*指定y为双精度实数*/
|
单精度实数在内存中占4个字节,而双精度实数在内存中占8个字节。
4. 字符型
(1) 字符常量
C的字符常量是用单引号括起来的一个字符,如‘a’、‘A’等,注意以上两个字符是不同的。另外,C 语言还允许以一个“\”开头的特殊字符常量,具体规定如表 1-1 所示。
表1-1 特殊字符常量表
|
字符类型< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
功 能 |
|
\n |
换行 |
|
\t |
横向跳格 |
|
\v |
竖向跳格 |
|
\b |
退格 |
|
\r |
按Enter键 |
|
\f |
走纸换页 |
【代码1-2】
main()
{
printf(" ab c\t de\rf\tg\n");
printf("h\ti\b\bjd");
}
|
读者可以自己思考一下程序的输出结果。
(2) 字符变量
用来存放字符常量,且只能放一个字符,定义规则如下:
(3) 字符数据在内存中的存储形式和使用方式
字符变量在对应的内存中存放的是该字符相应的ASCII码,例如字符‘a’的ASCII代码为97,‘b’的ASCII代码为98,而字符型与整型变量还可以互相赋值。
【代码1-3】
main()
{
char c1,c2;
c1=97,c2=98;
printf("%c %c",c1,c2);/* "%c"表示输出格式为字符类型*/
}
|
输出结果是:
(4) 字符串常量
字符串常量与字符常量的区别在于前者是双引号括起来的字符序列,而后者是单引号括起来的单个字符。如在内存中‘a’的长度是一个字符,而“a”则占有两个字符,后者包括结束标志“\0”。
5. 枚举型
所谓“枚举”,是指将变量的值一一列举出来,变量的值只限于列举出来的值,可用如下定义形式:
enum weekday {sun,mon,tue,wed,thu,fri,sat};
|
它定义了一个名为weekday的枚举类型,能取7个值。然后,我们可以用此类型来定义变量,如:
则date被定义成枚举变量,它能取sun到sat这7个值之一,如:
也可直接定义枚举变量,如:
enum weekday {sun,mon,tue,wed,thu,fri,sat} date; /*效果与上相同*/
|
在C编译中,对枚举元素按常量处理,且它们是有值的。在上面的定义中,sun的值为0,…… sat的值为6。
【代码1-4】
main()
{
enum {sun,mon,tue,wed,thu,fri,sat} date;
date=mon;
printf("%d",date);
}
|
输出结果是:
6. 布尔型
C语言将非零整数都认为是“真”,认为零是“假”,布尔型只有“真”、“假”两个值。在表达式中,布尔量也作为整数处理,整数也可出现在布尔表达式中。
【代码1-5】
main()
{
int m=1,j=6;
while(m)/* m不等于0,为真*/
{
j=j+m;
m=m-1;
}
printf("%d",j);
}
|
则最后输出结果是:
7. 数组
数组是有序数据的集合,数组中每一元素都属于同一数据类型,用一个统一的数组名和下标来惟一地确定数组中的元素。
(1) 一维数组
① 一维数组的定义格式如下:
如:
数组名为a,且有10个元素,下标从0到9,即a[0]到a[9]。
注意常量表达式不能是变量。
② 一维数组的引用:只能逐个引用数组元素而不能引用整个数组。
【代码1-6】
main()
{
int j,a[10];
for(j=0;j<=9;j++)
a[j]=j;
for(j=9;j>=0;j--)
printf("%d",a[j]);
}
|
运行结果是:
③ 一维数组的初始化列举如下。
static int a[10]={0,1,2,3,4,5,6,7,8,9};/*static是"静态存储"的意思*/
|
则a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9。
如果花括号中值的个数少于10,则后面的都为0。
(2) 字符数组
字符数组是一类特殊的数组,数组的每一个元素存放一个字符。
下面是它的定义方式:
如:
static char c[5]={'a', 'e', 't', 'g', 'b'};
|
8. 指针
指针是C语言中的一个重要特色,可以说是C语言的精华。它的概念非常复杂,使用非常灵活,是 C 语言中最大的难点。
一个变量在内存中的地址就称为该变量的“指针”。我们通过地址就能找到所需的变量单元。
指针变量的定义用下面的形式:
例如:
定义了一个指针变量pointer_1,它指向整型变量。
如果还定义了一个整型变量i,则可用赋值语句使一个指针变量指向一个整型变量。如:
&i是变量i在内存中的地址。
或写成:
这里我们只做简要的介绍,读者如想再深层次地了解指针,可查阅有关方面的书籍。最后我们以一个程序结束指针的学习。
【代码1-7】
main()
{
int a,b;
int *pointer_1,*pointer_2;
a=100,b=10;
pointer_1=&a;
pointer_2=&b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",*pointer_1,*pointer_2);
}
|
程序运行的结果为:
9. 结构体
结构体是C语言提供的一种数据结构,相当于其他高级语言中的“记录”。
下面是定义一个结构体类型的一般形式:
struct结构体名
{
成员列表
}变量名列表;
|
对各成员都应进行类型说明,如:
下面是一个具体实例:
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}student1={"33","zhanwei","m","22","75","32#307"};
|
定义了一个struct student类型的变量student1,它包括num、name、sex、age、score、addr不同类型的数据项,各项初值分别为 33、zhanwei、m、22、75、32#307。
10. 共用体
几个不同的变量存放到同一段内存的结构,称为“共用体”。
“共用体”类型变量的定义形式如下:
如:
union data
{
int j;
char ch;
float f;
}a, b, c;
|
上面定义了一个union data类型,再将a、b、c定义为 union data类型。
共用体变量的引用方式如下:
上语句引用共用体变量a中的整型变量j。