![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5ed4919e9b472e6e60201e62b9825f38.png)
数组
定义:数组是一种用于连续存储,同种数据类型的数据结构。
#include<stdio.h>
struct Student{
int old;
int class;
int hight;
float score;
};
int main(){
int a[10] = {0,1,2,3,4,5,6,7,8,9}; //定义一个可以存储10个int类型的数组a
float f[2] = {1.0,2.5}; //定义一个可以存储2个float类型的数组f
struct Student class3[50] = {0};//i定义一个可以存储50个学生结构体数组Class3
}
数组的操作:下标运算,a[0]表示a数组的第0个元素,a[1]表示a数组的第1个元素,a[i]表示数组的第i个元素。
指针
指针:用于存储内存地址的数据类型。
指针和数组后面单独叙述。
枚举
C语言中的枚举(enum)用于定义一组命名的常量。它们提供了一种方式来表示具有离散值的变量或选项集合。
enum{
ACC_OFF = 0,
ACC_ON,
IGN_OFF = 3,
IGN_ON,
};
枚举的特性:
1.枚举的第一个元素若未给初始值,则默认为0。
2.枚举中某个常量的值 = 前一个值 + 1。
ACC_ON = ACC_OFF + 1 = 2;
IGN_ON = IGN_OFF +1 = 4;
3.枚举变量其实是一个 int 类型的常量集合。数据大小也是4byte。
枚举的主要作用如下:
1.常量命名:枚举允许我们为一组相关的常量指定有意义的名称。这样可以提高代码的可读性和可维护性,因为使用枚举常量的代码更易于理解。
2.替代整数值:枚举常量可以代替使用硬编码的整数值,使代码更具可读性。例如,使用enum定义星期几的常量可以替代使用0到6表示每个星期几的代码。
3.switch语句:枚举常量在switch语句中非常有用。使用枚举常量作为switch语句的条件可以使代码更加清晰,易于理解,并且可以避免使用大量的if-else语句。
总之,C语言中的枚举提供了一种方便的方式来定义一组常量,使代码更易读、可维护。
在C++中: 通过枚举类型创建一个变量,它只能取枚举中定义的某个值,启动限制取值范围的作用
1.枚举变量在C语言中可以超出它的取值范围,
2.在C++中枚举变量不能超出取值范围,因为C++中只允许用enum中的常量给enum变量赋值。
C代码
#include <stdio.h>
#include <stdbool.h>
typedef enum ACC_STATE{
ACC_OFF = 0,
ACC_ON = 1,
}AST;
int main()
{
AST accst = ACC_OFF;
accst = ACC_ON;
accst = 7; //C语言不会报错,可以超过枚举范围赋值
printf("accst = %d accst_size = %d\n",accst,sizeof(accst));
return 0;
}
C++代码
#include<iostream>
typedef enum STATE{
A,
B,
C,
D,
}STA;
int main()
{
STA c = A;
c = D;
c = 3; //error
std::cout << c << std::endl;
return 0;
}
结构体
上文中数组是存储同一种数据类型集合的数据结构。
结构体:它是一种可存储多个不同数据类型的数据结构。
#include <stdio.h>
struct Student{
int old;
int class;
int hight;
float score;
}xm;
//声明结构体S图dent,并定义一个全局的结构体变量xm
//old,class,hight,score都叫做结构体Student的成员变量
/*
struct {
int old;
int class;
int hight;
float score;
}xs; //这样可以定义一个结构体变量xs,但是无名的结构体就无法再定义其他结构体变量。
//无名结构体与typedef结合使用可以重命名一个结构体类型。下次使用该类型定义变量时,会简单很多。
typedef struct{
int old;
int class;
int hight;
float score;
}STD; //使用typedef结构体重命名,将这个无名的结构体类型重命名为STD类型。
*/
int main()
{
struct Student xh = {1,2,3,4.0}; //结构体初始化
xm = xh; //结构体可以整体赋值
printf("xm.old = %d,xm.score = %f\n",xm.old,xm.score); //xm.old ->结构体变量名.成员变量名 来获取结构体变量中某个成员的值
return 0;
}
位域
在存储空间宝贵的情况下,有时候需要将多个成员保存在一个字节中,就会采用到位域这种数据类型。
#include <stdio.h>
typedef struct{
unsigned int old:8;
unsigned int class:4;
unsigned int hight:8;
// unsigned int :0;
unsigned char sex:1;
//char sex; //位域需要使所有成员的符号都保持一致。否则存储的数据会出错。
unsigned char bloodtype:3;
unsigned char grade:4;
}STD;
int main()
{
STD xm;
xm.old = 24;
xm.class = 3;
xm.hight = 185;
xm.sex = 1;
xm.grade = 11;
printf("xm.sex = %d,xm.grade = %d\n",xm.sex,xm.grade);
printf("xm_size = %d,xm.old = %d,xm.class = %d,xm.hight = %d\n",sizeof(xm),xm.old,xm.class,xm.hight);
}
运行结果:
fan@fan-virtual-machine:~$ ./a.out
xm.sex = 1,xm.grade = 11
xm_size = 4,xm.old = 24,xm.class = 3,xm.hight = 185
总结:
1.位域的成员类型不能使用浮点类型,常见的成员类型有 unsigned int、unsigned char、int、char 等等
2.位域中的成员的符号类型必须保持一致。
3.建议位域中所有成员类型都保持一致。上述是为了测试,不建议在程序中这么处理。
共用体(联合体)
共用体:顾名思义,可以在同一块存储空间中存储不同的数据类型。
#include <stdio.h>
typedef struct{
int old;
int class;
int hight;
}STD;
typedef union{
int data[3];
float fl;
STD studentInfo;
}DATA;
int main()
{
DATA a = {24,3,185};//共用体默认使用第一个成员进行初始化
DATA b = {.fl = 1.25};//指定初始化成员的方式初始化
printf("a.old = %d,a.class = %d,a.hight = %d\n",a.studentInfo.old,a.studentInfo.class,a.studentInfo.hight)
printf("b.old = %d,b.class = %d,b.hight = %d\n",b.studentInfo.old,b.studentInfo.class,b.studentInfo.hight);
}
运行结果:
fan@fan-virtual-machine:~$ ./a.out
a.old = 24,a.class = 3,a.hight = 185
b.old = 1067450368,b.class = 0,b.hight = 0
总结:
1.共同用体的大小为最大的成员变量的大小。
2.公用体所有成员变量使用同一块内存且相对于基地址的偏移量都是0.也就是说所有成员变量使用的起始地址是一样的。