引文
我们首先要了解一下结构体的作用是干什么的?有什么用处?我们都知道,在记录每一个学生的时候都是需要知道他的名字、学号、成绩、年龄等一系列信息。那么我们在程序里面记录这些东西,那么就需要用到很多的变量,变量一多,我们就觉得烦,想着能不能简化一下,这时候结构体就诞生了,结构体就是用来存放这样一组数据的集合。
1.结构体概述
结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型,
结构体可以容纳需要的任意多数据项。
2. 结构体声明和定义
声明一个结构体需要关键字(struct) 结构体类型名 { 变量 }; 在这里struct表示结构体的开始。比如下面我们定义一个student的结构体。
struct student_t //这里的_t是表示这是个结构体
{
int ID;
char name[20];
int age;
float scort;
};
这是声明一个结构体,结构体类型声明形成了创建结构体变量的模板,声明模板时若没有定义变量是没有开辟内存空间的,结构体中的变量称为结构体元素或结构体成员。
然后我们如何定义呢?有三种方法,一种我们直接定义它:struct+结构体类型名+变量名;例如:struct student_t student; 另一种是在声明的时候直接定义了,就是在分号的前面,例如:
struct student_t //这里的_t是表示这是个结构体
{
int ID;
char name[20];
int age;
float scort;
}student1, student2;
最后一种是在声明的时候加个typedef,表示定义一个数据类型,在分号的前面要加一个名称(一般大写)。
typedef struct student_t //这里的_t是表示这是个结构体
{
int ID;
char name[20];
int age;
float scort;
}STU;
定义的话就变得简单一些:STU student1;
3. 结构体初始化:
初始化一个结构体,和初始化一个数组类型,都是要有{ }。而且初始化也可以部分初始化。下面看几个例子。
STU student1={1001, “xiaoming”, 13, 100};//全部赋值
STU student1={1001, “xiaoming”, };//部分赋值,相对应的其他会变成0(如果是字符数组会变成‘\0’)
4. 结构体内存的计算
结构体的内存和其他的变量不一样,它有一个内存对齐的问题,比如上面的student这个结构体,ID占4个字节,name这个数组占20个字节,age占4个字节,scort占4个字节,加起来就是36个字节,这是简单的计算,如果结构变成:
struct student_t
{
int ID;
char name[17]; //17个字节?
int age;
float scort;
};
这个结构体的内存不会是33个字节而是36个字节,其中name开辟的空间不是17个字节,而是20个字节。再来:
struct student_t
{
int ID;
char name;
double scort; //8个字节
};
这个结构体,在内存中会开辟16个字节,不会是24个,因为int和char这两个内存比较小,在存储的时候会连接在一起了。再来:
struct student_t
{
int ID;
double scort;
char name;
};
这个结构体,在内存中会开辟24个字节,不会是16个,因为int和char在存储的时候没有连接在一起。
5. 结构体成员的访问
变量名+点运算符+元素名
例如,访问一号学生的名字和成绩:
等到了指针的时候,这个访问会有区别改成箭头。这个以后会说。
printf(“%s, %f”, student1.name, student1.scort);
6. 赋值和拷贝
结构体和数组不同的是,我们数组是不可以直接赋值的,而我们结构体确是可以:student2=student1;
另外我们还可以用一个函数来拷贝内存,memcpy(&student2, &student1, sizeof(STU));
第一个参数是目标地址,第二个参数是源地址,第三个参数是要拷贝的内存大小。
我们在对结构体中的字符串数组修改的时候可以用strcpy这个函数来帮我们实现,简化代码。
7. 结构体的应用
结构体可以作为函数的参数,函数的返回值,结构体也可以是一个数组,这叫结构体数组。在作为函数的参数的时候这是按值传递的,如果是结构体数组那么就是按地址传递的(因为不同变量的话就是按值传递,而数组的话,因为数组名是地址,所以是按地址传递)。结构体中可以嵌套结构体,不过不能嵌套自己,如果嵌套自己的指针的话那么是可以的,因为指针是地址,他的空间是知道的(4个字节),而嵌套自己的话就不知道内存空间是多少了,所以会有问题。
以上就是结构体有关的知识点,下次给大家分享一下指针的初级应用。