一、构造类型的概念
构造类型也称为组合类型,是由基本类型按照一定规律组合而成。
二、数组类型
数组是由同类型数组组合而成的序列,用一个统一的数组名来标识这一组数据。
2.1 数组定义
一维数组:类型标识符 数组名[常量表达式];
二维数组:类型标识符 数组名[常量表达式][常量表达式];
三维数组:类型标识符 数组名[常量表达式][常量表达式][常量表达式];
2.2 数组的初始化
1) 定义数组的同时可以直接给数组中的元素赋初值,将需要赋的值一一列举并用一对大括号括起来,然后用逗号分隔即可。
如:
int array[5]={1,2,3,4,5};
2) 只给数组中的部分元素赋初值;
int array[5]={1,2,3};
其余元素值均为0
3)如果初始化数组时,全部给出,可以不指定数组长度
int array[]={1,2,3,4,5};
2.3 数组元素的引用
方式1:下标法
格式:数组名[下标]
方式2:地址法
格式:*(数组名+下标)
#include <QCoreApplication>
#define f(x) x*x
#define g(x) (x)*(x)
#define h(x) ((x)*(x))
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int array[5] = {1,2,3,4,5};
qDebug("%d",array[3]);
qDebug("%d",*(array+3));
int *p = array;
qDebug("%d",*(p+3));
int *pp = &array[3];
qDebug("%d",*pp);
return a.exec();
}
输出结果:
4
4
4
4
2.4 字符串与字符数组
字符串是若干个有效字符(字母、数字、专用字符、转义字符等)的序列。C语言中没有字符串变量,字符串不是存放在一个变量中,而是存放在一个字符型数组中。因此,为了存放字符串,常常在程序中定义字符型数组。
字符串与字符数组两个术语在含义上有区别,字符串存放在字符数组中,但字符数组与字符串可以不等长,字符串以“\0”作为结束标志。
字符数组的赋初值
1) 逐个为元素值赋初值
char str[2]={'a','b'};
2) 对字符数组指定一个字符串初值
char str[]={"abcd"};
注意:单个字符是用单括号括起来,而字符串是用双括号括起来,在指定字符串赋初值时,将字符串中各个字符逐个赋给字符数组中各个元素,但要注意一点是系统会自动地在最后一个字符后面加入一个‘\0’字符。
三、结构体类型
3.1 结构体类型
格式:
struct 结构体名{
成员项表列;
};
注意:不要忘写花括号外的分号
结构体类型特点:
1) 它由若干个数据项组成,每一个数据项都属于一种已有定义的类型,每个数据项都称为一个结构体的成员,也可以称为“域”。
2)结构体类型并非一种,而可以由很多种,这与基本类型不同。
3)定义一个结构体类型,并不意味着系统将分配一段内存单元来存放各数据项成员。注意:这是定义类型而不是定义变量,定义一个类型只是表示这个类型的结构,即告诉系统它由哪些类型的成员,各占用多少字节,各按什么形式存储,并把它作为一个整体来处理,同时只定义类型是不分配内存单元的。
4)系统没有预先定义结构体类型,凡需使用结构体类型数据的,都必须在程序中自己定义。
3.2 结构体类型变量的定义
1) 在定义了结构体类型之后,把变量定义为该类型;
如:struct person student,worker;
2)在定义一个结构体类型的同时定义一个或若干个结构体类型变量;
struct 结构体名{
成员表列;
}变量名表列;
如:struct person{
} student,worker;
3)直接定义结构体类型变量;
如:struct{
}student,worker;
注意:此方式无法定义其他结构体类型变量;
3.3 结构体类型变量的初始化及引用
在初始化时,按照定义的结构体类型的数据结构,依次写出各初始值,依次写出各初值。
struct person student={“Wang Li”,18,'M'};
引用方法:结构体变量.成员名
如:student.name
注意:C语言不允许把一个结构体作为一个整体进行输入与输出。
3.4 结构体与数组区别
数组只能按序组织多个同类型的数据,结构体可以组织多个不同类型的数据。
四、共用类型
共用体数据类型是指将不同的数据项存放于同一段内存单元的一种构造数据类型。
定义格式:
union 共用体名{
成员表列;
}变量表项;
共用体类型很相似,与结构体类型区别是共用体变量中的各个成员共用内存中同一段变量空间。
注意:一个共用体变量不能同时存放多个成员变量的值,而只能存放其中一个值,这就是最后赋予它的值。
#include <QCoreApplication>
//#include "test.h"
#define f(x) x*x
#define g(x) (x)*(x)
#define h(x) ((x)*(x))
union exam{
int a;
float b;
char c;
} x;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
union exam *pt;
pt = &x;
x.a = 8;
x.b = 7.5;
x.c = 'A';
pt->a = 8;
pt->b = 7.5;
pt->c = 'A';
qDebug("%d,%.2f,%c",x.a,x.b,x.c);
qDebug("%d,%.2f,%c",pt->a,pt->b,pt->c);
qDebug("%d,%d",sizeof(int),sizeof(float));
return a.exec();
}
输出结果是:
1089470529,7.50,A
1089470529,7.50,A
4,4
union结构体内存情况:
—— —— —— —— a
—— —— —— —— b
—— c
五、枚举类型
枚举类型,是指这种类型的变量的值只能是指定的若干个名字之一。
#include <QCoreApplication>
enum color_name{
red,
yellow,
blue,
white,
black
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
enum color_name color;
color = black;
qDebug("%d",color);
return a.exec();
}
输出结果是:
4
1) enum是关键字,标识枚举类型,定义枚举类型必须用enum开头;
2)在定义枚举类型时,花括号中一些名字是程序设计者自己定义,命名规则与标识符相同;
3)它的值是一些整数,如果没有特殊定义,系统会自动默认从0开始,0,1,2,3...
4)可以在定义类型时对枚举变量进行初始化
enum color_name{
red = 3,
yellow,
blue,
white = 8,
black
};
5)枚举常量可以进行比较
if (color == red)
qDebug("red");
6) 一个枚举变量的值只能是定义的几个枚举常量之一,可以将枚举常量赋给枚举变量;
color = red;(正确)
color = 0;(错误)
7) 枚举常量不是字符串,不能用下面方法输出字符串“red”;
qDebug("%s",red);
可通过
qDebug("red");
六、文件类型
详见《深入浅出之文件》