第九章 结构体的使用

Posted 俺是充电鸭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九章 结构体的使用相关的知识,希望对你有一定的参考价值。

1. 结构体的声明和定义

介绍

  • 我们知道数组是同种类型值的集合,而结构就是可以将不同类型的值放在一起。
  • 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
  • 结构的成员可以是标量、数组、指针,甚至是其他结构体。

如我们可以将一个学生的一些属性放在一起

struct stu//定义一个结构体类型,就如int、char,struct stu是我们定义的结构体类型
{
    //成员变量
    char name[20];//名字
    int age;//岁数
    char id[20];//学号
};
int main()
{
    struct stu a;//定义一个struct stu类型的变量a,而对象a中就包含了名字,岁数,学号的属性
}

定义的几种类型

类型1:

struct stu
{
    char name[20];
    int age;
};
int main()
{
    struct stu a;//定义局部变量a
}

类型2:

struct stu
{
    char name[20];
    int age;
}s1,s2;//定义全局变量s1,s2

2. 结构体初始化

看这段代码

struct book
{
   float height;
   char name[20];
}b;
struct stu
{
    char name[20];
    int age;
    char id[20];
    struct book b;
};
int main()
{
    //初始化时,其实是和数组初始化一样,用大括号,里面放上初始化的值。若结构体里面包含结构体,则大括号里面	//在放一个大括号,里面放内部结构体初始化的值
    
    struct stu a={"bobo",18,"2021520",{15.8,"free"}};
}

3. 结构体成员访问

介绍

  1. 结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数,如:m.n(m为结构体变量,n为结构体中你想要访问的成员变量)
  2. 指向一个结构体的指针访问指向变量的成员是通过操作符(->)访问的。 如:m->n(m为指向一个结构体的指针,n为结构体中你想要访问的成员变量),也可以(*m).n
struct book
{
   float height;
   char name[20];
}b;
struct stu
{
    char name[20];
    int age;
    char id[20];
    struct book b;
};
int main()
{
    struct stu a={"bobo",18,"2021520",{15.8,"free"}};
    //法一
    printf("%s\\n",a.name);
    printf("%d\\n",a.age);
    printf("%.1f\\n",a.b.height);//若访问结构体中的结构体中的一个成员,先访问到内部的结构体,再访问内部结构体中的成员
    
    //法二
    struct stu* pa=&a;
    printf("%s\\n",pa->name);
    printf("%d\\n",pa->age);
    printf("%.1f\\n",pa->b.height);
    
    //法三
    printf("%s\\n",(*pa).name);
    printf("%d\\n",(*pa).age);
    printf("%.1f\\n",(*pa).b.height);
}

4. 结构体传参

注意

结构体传参的时候,要传结构体的地址更好

看一段代码

struct book
{
   float height;
   char name[20];
}b;
struct stu
{
    char name[20];
    int age;
    char id[20];
    struct book b;
};
void print1(struct stu p)
{
    printf("%s %d %s %.1f %s",p.name,p.age,p.id,p.b.height,p.b.name);
}
void print2(struct stu* pa)
{
    printf("%s %d %s %.1f %s",pa->name,pa->age,pa->id,pa->b.height,pa->b.name);
}
int main()
{
    struct stu a={"bobo",18,"2021520",{15.8,"free"}};
    
    //写一个函数打印a的内容
    
    print1(a);//结果为:bobo 18 2021520 15.8 free(正常打印)
    
    //再写一个函数,通过传a的地址打印a的内容
    
    print2(&a);//结果为:bobo 18 2021520 15.8 free(正常打印)
    
    return 0;
}

那么传值和传址有什么不同,哪个更好呢?(首选传址)

  1. 传参时,其实是对实参的一份拷贝,是会开辟一块空间来存储实参。传值,是将整个实参拷贝过去,而传地址,传过去的只是地址,传参的效率更高一些。

  2. 函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

那么什么是函数调用的参数压栈呢?

  • :一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表

  • 特点:先进的后出,后进的先出。(先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来))

  • 压栈:给栈里存数据

在这里插入图片描述

  • 每一个函数的调用都会在内存的栈区上开辟一块空间,并且数据都会如压栈一样一个一个的存放进栈区,如果数据比较多、大时,参数压栈就比较吃力,所以导致性能就会下降。

总结

以上介绍了个人对结构体简单的一些总结,而还有一些跟结构体有关的,后面会专门有一章再继续讲解结构体的更多知识点。希望大家喜欢我的内容,并且欢迎大家指正我的错误和不足。

以上是关于第九章 结构体的使用的主要内容,如果未能解决你的问题,请参考以下文章

第九章 Javascript之函数模型

第九章 结构体

构造数据类型实验

第九章:硬件抽象层

第九章:循环结构进阶

Python笔记·第九章—— 函数