volatile 关键字,可变的,比一起不会做优化,每次都是从内存中重新读取数据。而不是使用固定的值。
关于结构体,我们可以先放下不提。最先开始我们接触的基础数据类型有整形,浮点型,字符。但是我们的生活一张表中,有着各种各样的信息,而组成这些信息的数据 类型有很多,所以,仅仅使用这些基本数据类型是很难来用程序表达我们生活中想表述的信息的。所以开发人员在基本类型的基础上,引入了结构体的概念。
结构体的关键字(struct),首先我们需要定义一个结构体(是和我们想要表达的信息基本一致的结构)。
struct student{
int Id;
int Stu_name[20];//一个简单的学生信息结构,可以在里边继续添加更加详细的信息。
};
也可以如下定义
struct {
int Id;
int Stu_name[20];
}student;
也可以使用typedef
typedef struct student{
int Id;
int Stu_name[20];
}Stu;
//使用的时候,直接使用
Stu Stu1;
Stu Stu2;
Stu Stu3;
//可以使用赋值直接对结构体进行赋值。就像整形赋值一样,直接进行。
//初始化。
Stu Stu1 = {123456,"name"};//直接初始化。
Stu Stu1;
scanf("%d%s", &Stu1.Id, Stu1.Stu_name);//对结构体进行赋值操作。
void func(Stuuct *stu1)
{
stu1->Id = 123456;
stu1->Stu_name = "name";
}//也可以对结构体的每一项进行赋值。
结构体指针
Stu *Stu1;
Stu Stu2;
Stu1 = &Stu2;
func(Stu1);
//或者func(&Stu2);
也可以使用结构体数组。和普通数组的定义方法相同。
Stu Stu[100];//定义一个100个结构体的数组。
也可以使用结构体指针,指向结构体数组的首地址。
定义结构体时,结构体的大小不同于普通的数据类型,编译器给结构体的大小有对齐原则。
//结构体的字节对齐规则
struct str1 // 7
{
int a; // 4
char b; // 1 + 1
short c; // 2
}s1; // 8
struct str2
{
char a; // 1
char b; // 1
// + 2
int c; // 4
}s2; // 8
struct str3 // 6
{
int a;
char b;
char c;
// + 2
}s3; // 8
struct str4 // 10
{
struct str1 s; // 8
char a; // 1 + 1
short b;
}s4; // 12
typedef struct str5 // 5
{
int a;
char b;
}ST, p_ST; // ST是struct str5的类型名,p_ST是struct str5 类型的别名
struct str6 // 5
{
char a;
int b;
}S, *p = &S; // S是struct str6的变量名, p是此结构体的指针变量名。
//默认是4字节对齐,最大的基本数据类型和这个默认值要相比较,取其小
struct str7
{
char ab;
int a[2];
// char b;
};
结构体的大小取决于结构体中最大的元素类型。