一招解决结构体问题

    技术2022-07-10  142

    结构体

    引文1.结构体概述2. 结构体声明和定义3. 结构体初始化:4. 结构体内存的计算5. 结构体成员的访问6. 赋值和拷贝7. 结构体的应用

    引文

    我们首先要了解一下结构体的作用是干什么的?有什么用处?我们都知道,在记录每一个学生的时候都是需要知道他的名字、学号、成绩、年龄等一系列信息。那么我们在程序里面记录这些东西,那么就需要用到很多的变量,变量一多,我们就觉得烦,想着能不能简化一下,这时候结构体就诞生了,结构体就是用来存放这样一组数据的集合。

    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个字节),而嵌套自己的话就不知道内存空间是多少了,所以会有问题。

    以上就是结构体有关的知识点,下次给大家分享一下指针的初级应用。

    Processed: 0.011, SQL: 9