定义:数组、字符串(char[],string)、结构体、共用体、枚举统称为符合类型。
一:数组
不必多讲,在此只注明几点
1:数组的初始化一般放在定义时,而之后不能对数组进行整个初始化,而只能通过
下标操作来单个进行初始化工作。
2:不能将一个数组赋值给另外一个数组 a = b是不允许的。
3:在对数组进行初始化的时候,例如int a[10] = {9},那么后面的将被默认初始为0.
二:字符串
不多介绍,转优快云上的部分
char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到/0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到/0为止之前
int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以'/0'结尾的
三:结构体
记住一种结构体,指定占用特定位数的结构成员,例如
struct str_test
{
unsigned int i_test:4;
unsigned int:4;
bool b_test:1;
}
四:共用体:
共用体的声明为
union union_test
{
int union_int;
double union_double;
}
在此可以看到,结构体的声明与共用体差不多,但是意义上是有区别的,共用体虽然可以保存
不同类型的数据,但是一次只能保存一种类型的数据。例如
union my_union;
my_union.union_int = 4;//init union_int
my_union.union_double = 19.21;//init union_double,union_int not exists
如果某个变量将用来保存不同字段,但每次只能保存一种那么可以用到公用体。
五:枚举
enum spectrum{red,orange,yellow,green};
以上语句完成的工作有,一是声明spectrum 为美举型,二是将red,orange,yellow,green作为符号
常量,它们的值为0,1,2,3
枚举中的允许与不允许
spectrum band;
band = orange;//ok
band = 9;//invalid,9 is not a enum;
band = red + 1;//invalid,red + 1 is a int ,not a enum
++band;//invalid
band = red + orange;//invalid ,red + orange is a int
band = spectrum(3);//valid
enum的取值范围,找到enum中的最大值,然后找到大于这个最大值、最小的2^n - 1,则为上限,如果
enum的最大值为100,那么它的上线为128 - 1 = 127;对于下限,如果enum中的元素都不小于0,那么下
限为0,如果有负数存在,那么跟计算上线差不多,如果最小为-5,那么下限为-8 + 1 = -7.
六:指针和自由存储空间
1.计算机存储数据是必须跟踪的三个属性:信息存储的位置、信息的值、信息的数据类型。
2.指针的初始话是初始化指针而不是指针指向的值,所以下面的操作时危险的(在指针解引用操作前初始化指针)
int* ipr_test;
*ipr_test =11;
3.一个指针数组的例子
- int* p3 = new int[3];
- p3[0] = 1;
- p3[1] = 2;
- p3[2] = 3;
- p3 = p3 + 1;//允许,执行后p3[0] = 2,p3[1] = 3;
- p3 = p3 - 1;//允许,还原p3的指向
- delete [] p3;//有new操作一定要有delete 操作,new 有【】则delete 也有【】