C语言知识快表(2):数值、结构体
1.数组
在内存里面一串连续的数据类型。
1.1 一维数组
(1)一维数组定义格式:
//类型的说明 数组名[整形表达式];
int ArrayName[10];
(2)一维数组的引用:
数组名就是数组的首地址!
//数组名[下标] 或者 *(数组名+下标)
ArrayName[0] *(ArrayName+0)
数组的下标是从0开始的,如果数组定义为100的大小,他的下标最大的取值为 99
(3)一维数组的赋值:
对一维数组进行整体赋值:
int ArrayName[10] = {1,2,3,4,5}; //对数组进行整体赋值。
//注意:当整体赋值中的,值不能填满数组时,数组会把其余的值填写为 0
int ArrayName[10] = {0}; //所以利用上面的规则,对数值进行清空操作
1.2 二维数组
其实,在计算机中,他是不知道什么是二维,三维 … 计算机统一把数组看作是一维而已,二维数组的概念是我们人为引入的,就是方便操作数据而已。
(1)二维数组的定义:
//类型的说明 数组名[整形表达式][整形表达式1];
int ArrayName[2][5];
//二维数组的类型: 类型的说明 [整形表达式1]
int [5] //二维数组的类型 ArrayName[2]
(2)二维数组的引用:
//数组名[下标][下标1]
ArrayName[1][4];
// *(*(数组名+下标)+下标1)
*(*(ArrayName+1)+4)
越界引用: 利用数组的空间是连续的,但不推荐使用
ArrayName[1][2] 可以写成 ArrayName[0][8]
1.3 字符串数组
存放字符串所使用的数组。" " 双引号括起来的内容就是字符串,字符串的结束是 ‘\0’;
(1)定义字符串数组:
//char 数组名[数组大小]; -> 注意:定义字符数组的时候记得要考虑 /0
char ChStrName[3] = {"abc"}; // 编译不会报错,但是我们的 /0 就会越界保存了。
char ChStrName[4]; //这样才比较好。
(2)字符串数据的赋值方式:
除整体赋初始值,其他时候整体赋值要用 strcpy();
char ChStrName[100] = {"abcdefg"};
char ChStrName[100] = "abcdefg";
char ChStrName[100] = {'a','b','c','d'};
1.4 变长数组
变长数组不能在定义时赋初值,要在定义完毕后赋值。
int size = 10;
int ArrayName[size];
1.5 带缺省数组
在用户赋值的时候,计算机会根据用户赋值的个数去确定数组的大小
int ArrayName[] = {1, 2, 3, 4};
二维:不能缺省类型
int ArrayName[][] = {1, 2, 3, 4}; //错误,缺少类型
int ArrayName[][3] = {{1, 2, 3},{4, 5, 6}}; //正确,类型为 int [3]
2.结构体
2.1 结构体的定义:
关键字 struct
/**********************************
struct 结构体名称
{
成员列表 (描述符物体的成员)
};
***********************************/
struct student
{
int ID;
int Age;
char Gender;
char Name[1024];
};
2.2 结构体进行初始化:
(1)整体进行初始化
① 依次整体赋值:
//struct 结构体名称 结构体变量名 = {成员1,成员2,成员3};
struct student xiaomin = {1001, 18, 'M', "xiaomin"};
整体初始化的时候,是根据括号中的数据依次赋值的,所以,依次的时候类型一定要匹配。(最好就是有多少个值就赋多少个)
② 不依次整体赋值:
//struct 结构体名称 结构体变量名 = {.成员1=数据,.成员3=数据};
struct student xiaomin = {.ID = 1001, .Gender = 'M'};
(2)结构体中的每一个数据进行赋值
//结构体变量名.成员 = 数据;
struct student xiaomin = {0};
xiaomin.ID = 1001;
xiaomin.Age = 18;
xiaomin.Gender = 'M';
//xiaomin.Name = "xiaomin"; //错误的,Name表示首地址
strcpy(xiaoming.Name,"xiaoming"); // 复制要用strcpy();
2.3 结构体的引用
//结构体变量名.成员X;
xiaomin.ID
当结构体变量名为指针的时候我们的赋值与引用, “->” 符号去访问变量 (把 . 改为 ->)
struct student *pSt = &xiaomin;
pSt->ID = 1001;
pSt->Age = 18;
pSt->Gender = 'M';
2.4 结构体的大小计算:
结构体在分配成员的空间大小时 是根据 最大的数据类型 去分配的 。
如果最大的数据类型为 2个字节 就按照 2字节对齐, 4个字节 就按照 4字节对齐
struct test
{
int a; //-> 4
char b; //-> 1 --》 4
int c; //-> 4
};
sizeof(struct test); // 12 --》 4字节对齐
根据分配原则得到:
在定义结构体成员时,相同的类型放到一起,这样定义出来的结构体大小是最节省空间的
5.共用体
它里面的空间是使用最大的哪一个数据类型的空间
关键字 union
/********************************
union 共用体名称
{
成员列表; ->基本的数据类型
}
********************************/
union test
{
int a; //-> 4
char b;
int c;
};
sizeof(union test); // 4 --》最大数据类型为int
6.枚举类型
把一个类型中的所有可能取值都列举出来,自动赋值不需要用户去赋值(用描述一些存在的事物),其实就是一个整形,成员列表中不需要写类型 (默认是整形)
关键字 enum
enum 枚举名称
{
成员;
}
上一篇: Java任务:随机点名器
下一篇: JAVA基础——随机点名器