构造数据类型——枚举、数组、结构、联合、指针
枚举类型
-
enum <枚举类型名> {<枚举值表>};
<枚举值表>为用逗号隔开的若干个整型符号常量。 -
E.G. enum Day {SUN,MON,TUE,WED,THU,FRI,SAT};
-
默认情况下,第一个枚举值为0,其它的值为前一个值加1。
-
enum Day {SUN,MON,TUE,WED,THU,FRI,SAT}; Day d1; d1 = SUN; d1 = 1;//报错 不能把一个整型值赋值给枚举类型的变量 //但是可以把一个枚举值赋值给一个整型变量 d1 = d1+1; //error 因为d1+1是整型 d1 = (Day) (d1+1); cin >> d1; //Error cout << d1; //OK, //不能对枚举类型的值直接进行输入,但可以进行输出
数组类型
一维数组
- typedef <元素类型> <一维数组类型名>[<元素个数>];
<元素类型>为任意C++类型(void除外)
<元素个数>为整型常量表达式 typedef int A[10]; - 初始化表中的值可以少于数组元素个数,不足部分的数组元素初始化成0
- int c[]={1,2,3}; //隐含着c由三个元素构成
- 不能对两个数组进行整体赋值
- 函数传递:int max(int x[],int num) num是个数,默认传递的是首地址,所以形参是能改变实参的值的。
- 字符串
- char s[10]; 长度为9的字符串 最后有一个\0
- strlen(s);
- str[i]-‘0’
- 初始化:
- char s[10]={‘h’,‘e’,‘l’,‘l’,‘o’,‘\0’};
char s[10]={“hello”};
char s[10]=“hello”;
char s[]=“hello”;
- char s[10]={‘h’,‘e’,‘l’,‘l’,‘o’,‘\0’};
- strlen strcpy strcmp 之类的函数
二维数组
-
typedef <元素类型> <二维数组类型名>[<行数>][<列数>];
<元素类型>为任意C++类型(void除外)
<行数>和<列数>为整型常量表达式 -
初始化:
- int a[2][3]={{1,2,3},{4,5,6}};
int a[2][3]={1,2,3,4,5,6};
int a[2][3]={1,2,3,4}; 以上初始化按照数组的行来进行
int a[2][3]={{1,2},{3,4}};每一行的前2个分别初始化为1、2和3、4,其它为0
int a[][3]={{1,2,3},{4,5,6},{7,8,9}}; 行数为3
- int a[2][3]={{1,2,3},{4,5,6}};
-
函数传递:
- 被调用函数的形参应为不带数组行数的二维数组定义及其行数。例如:
int sum(int x[][5], int lin) - 降为一维:int sum(int x[], int num)
- a[10][5] sum(a[0],10*5)
- 被调用函数的形参应为不带数组行数的二维数组定义及其行数。例如:
结构类型
-
定义:struct <结构类型名> {<成员表>};
-
初始化:Student some_student={2,“李四”, FEMALE,{1970,12,20},“北京”, MATHEMATICS}; 依次进行,但是在定义一个结构类型时,不能对其成员进行初始化
-
访问:<结构类型变量>.<结构成员名>
-
结构类型的名字可以与同一作用域中的其它非结构类型标识符相同
-
名表:
-
一个由一系列名字及其相关信息所构成的表
-
可以用一个一维数组来表示,每个元素用一个结构来表示
-
const int LEN=20; const int T_LEN=100; struct TableItem { char name[LEN]; ...... //其它信息 }; TableItem name_table[TLEN];
-
名表查找是指根据某个名字在名表中查找与该名字相关的信息。
- 顺序查找/折半查找(二分法)
-
联合类型
-
用一个类型表示多种类型的数据,只占用最大元素的空间
-
分阶段地把它作为不同的类型来使用
-
给一个联合类型的变量赋了一个某种类型的值之后,如果以另外一种
类型来使用这个值,将得不到原来的值。 -
union A { int i; char c; double d; }; A a; a.i = 1; //给变量a赋一个int型的值 ... a.i ... //把a当作int型来用 a.c = 'A'; //给变量a赋一个char型的值 ... a.c ... //把a当作char型来用。
-
可利用联合类型来实现多种数据共享内存空间
指针类型
-
typedef <类型> *<指针类型名>;
-
int* p,q; //p为指针变量,q为int型变量
-
int *p=&x; 指针存的是内存地址
-
(*<指针变量>).<结构成员>或●<指针变量>-><结构成员>
-
该操作通常用于以指针方式来访问数组元素。例如:
int a[10]; int *p; p = &a[0]; //或 p = a; //访问数组a的元素可采用: ● a[0]、a[1]、...、a[9] ● *p、*(p+1)、...、*(p+9) ● p[0]、p[1]、...、p[9]
-
两个同类型的指针相减,实际结果由指针所指向的类型来定。
-
int a[6]; int *p = &a[0]; int *q = &a[2]; cout << q-p << endl; //输出2
-
同类型的指针比较:比较它们所对应的内存地址的大小
-
特殊的输出:
char str[]="ABCD"; char *q=&str[0]; cout << *q; //输出q指向的字符:A cout << q; //输出q指向的字符串:ABCD cout << (void *)q
-
int max(int x[],int num)(x[i])//int max(int *x,int num)*(x+i)
-
指向常量的指针: 自身可以改变,但是指向的东西的值不能