将按某种逻辑关系组织起来的一组数据元素,按一定的存储方式存储在计算机中,并在其上定义了一个运算的集合,称为一个数据结构。
数据类型是高级程序设计语言中的一个基本概念,它和数据结构的概念密切相关。
一方面,在程序设计语言中,每一个数据都属于某种数据类型。类型显式或隐式地规定了数据的取值范围、存储方式以及允许进行的运算。因此可以认为,数据类型是在程序设计语言中已经实现了的数据结构。
另一方面,在程序设计过程中,当需要引入某种新的数据结构时,必须借助编程语言提供的数据类型来描述数据的存储结构。
下面总结C/C++语言中常用的数据类型。
C/C++语言中的基本数据类型有int型、float型和char型。int型可以有3个修饰符:short(短整型)、long(长整型)和unsigned(无符号整型)。
C/C++语言允许直接对存放变量的地址进行操作。如定义:
int i,*p;
其中,i是整型变量;p是指针变量(它用于存放某个整型变量的地址)。表达式&i表示变量i的地址,将p指向整型变量i的运算为:p=&i。
对于指针变量p,表达式*p是取p所指变量的值,例如:
i=2;p=&i;
printf("%d\n",*p);
输出结果为i的值即2。可以使用malloc()函数为指针分配一片连续的空间,例如:
char *p;
p=(char *)malloc(10*sizeof(char));
p="China";
printf("%c\n",*p);
printf("%s\n",p);
上述代码先定义字符指针变量p(没有指向有效的字符数据,即p的值没有意义),使用malloc()函数为其分配长度为10个字符的空间,将该空间的首地址赋给p(尽管不知道这个地址是多少,但p的值已经有了意义),再将字符串“China”放到该空间中,所以第1个printf语句输出的是首地址的字符即“C”,而第2个printf语句输出的是整个字符串即“China”。
数组是同一类型的一组有序数据的集合。数组有一维数组和多维数组。数组名标识一个数组,下标指示一个数组元素在该数组中的顺序位置。
数组下标的最小值称为下界,在C/C++语言中总是为0。数组下标的最大值称为上界,在C/C++语言中数组上界为数组定义值减1。例如,int a[10]定义了包含10个整数的数组a。
结构体是由一组称为结构体成员的数据项组成的,每个结构体成员都有自己的标识符。例如:
struct teacher
{
int no;
char name[8];
int age;
};
定义了一个结构体类型teacher,有以下代码:
struct teacher t1={1,"陈华",34}; /*定义结构体变量t1并初始化*/
struct teacher t2={5,"王强",48}; /*定义结构体变量t2并初始化*/
printf("%d,%s,%d\n",t1.no,t1.name,t1.age); /*输出结构体变量t1的各成员值*/
printf("%d,%s,%d\n",t2.no,t2.name,t2.age); /*输出结构体变量t2的各成员值*/
执行结果如下:
1,陈华,34
5,王强,48
共用体是把不同的成员组织为一个整体,它们在存储器中共享一段存储单元,但不同成员以不同的方式被解释。例如:
union tag
{
short int n;
char ch[2];
};
定义了一个共用体类型tag,有以下代码:
union tag u;
u.n=0x4142;
printf("%c,%c\n",u.ch[1],u.ch[0]);
通过赋值后,成员n的两个字节中,高位为64,低位为65,分别对应u.ch[1]和u.ch[0]成员,所以printf输出为A和B。
C/C++语言中允许使用typedef关键字来定义同名的数据类型名,例如:
typedef char ElemType;
将char类型与ElemType等同起来。特别是将代码较长的结构体类型定义用新类型来替代,例如:
typedef struct student
{
int no;
char name[10];
char sex;
int cno;
}StudType;
这样,StudType等同于学生结构体类型,可以使用该类型定义变量:
StudType s1,s2;
等同于:
struct student s1,s2;