• C语言结构体


    前言

    今天我们来看一下结构体,我们知道数组是同一类型的元素集合,但日常生活中我们常常要把很多不同类型的元素写在一起,例如一本书的书名、作者、价格、发售日期等,这时候我们就要用到结构体了。

    结构体的声明

    结构体的基础知识

    结构体是一些值的集合,这些值称为成员变量。结构体的每个成员可以是不同类型的变量。

    结构体声明

    struct tag
    {
    	member - list;
    }variable - list;
    
    • 1
    • 2
    • 3
    • 4

    例如描述一个学生:

    struct Stu
    {
    	char name[20];//名字
    	int age;//年龄
    	char sex[5];//性别
    	char id[20];//学号
    }Stu;//分号不能丢
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    结构体成员的类型

    结构的成员可以是变量、数组、指针,甚至是其他结构体。

    结构体变量的定义和初始化

    有了结构体类型,那如何定义变量,其实很简单。

    struct Point//这里struct Point是声明
    {
    	int x;
    	int y;
    }p1; //声明类型的同时定义变量p1,这里的p1是定义
    struct Point p2; //定义结构体变量p2
    
    struct Point p3 = {5, 6};//初始化:定义变量的同时赋初值。这里5会赋值给x,6会赋值给y。
    
    struct Stu //类型声明
    {
        char name[15];//名字
        int age; //年龄
    };
    struct Stu s = {"zhangsan", 20};//初始化
    
    struct Node
    {
        int data;
        struct Point p;//这里嵌套了上述的Point结构体
        struct Node* next;//结构体指针,这个后续会讲,多用于C语言的数据结构
    }n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
    struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    结构体成员的访问

    结构体变量访问成员
    结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。

    #include 
    struct Point
    {
    	int x;
    	int y;
    }p1;//声明类型的同时定义变量p1,这里不要忘记分号
    struct Point p2;//定义结构体变量p2
    int main()
    {
    	p1.x = 10;//.操作符
    	p1.y = 20;
    	printf("%d %d ", p1.x, p1.y);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述
    这里可以看到先对结构体变量赋值,又打印结构体变量都用到了。操作符。

    #include 
    #include 
    struct Stu
    {
    	char name[20];
    	int age;
    };
    struct Stu s;
    int main()
    {
    	strcpy(s.name, "zhangsan");//使用.访问name成员,就里注意将字符串赋值给结构体变量要用strcpy函数
    	s.age = 20;//使用.访问age成员
    	printf("%s %d ", s.name, s.age);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    以上为.操作符用法,以及对结构体变量赋值字符串。
    还有些时候我们要用到结构体指针,这个时候我们如果要使用结构体中的变量就需要用到其他操作符,以下为代码示例:

    #include 
    #include 
    struct Stu
    {
    	char name[20];
    	int age;
    };
    void print(struct Stu* ps)
    {
    	printf("name = %s age = %d\n", (*ps).name, (*ps).age);
    	//使用结构体指针访问指向对象的成员
    	printf("name = %s age = %d\n", ps->name, ps->age);
    }
    int main()
    {
    	struct Stu s = { "zhangsan", 20 };
    	print(&s);//结构体地址传参
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    如上代码所示,使用结构体指针时的两种方法分别是**(ps).变量名ps->变量名*,但是在以后的编程中我们通常默认使用后者。

    结构体传参

    这里我们直接看代码:

    #include 
    #include 
    struct S
    {
    	int data[1000];
    	int num;
    };
    struct S s = { {1,2,3,4}, 1000 };//结构体赋值
    //结构体传值参
    void print1(struct S s)
    {
    	printf("%d\n", s.num);
    }
    //结构体地址传参
    void print2(struct S* ps)
    {
    	printf("%d\n", ps->num);
    }
    int main()
    {
    	print1(s); //传结构体
    	print2(&s); //传地址
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述
    上面的 print1 和 print2 函数哪个好些?
    答案是:首选print2函数。
    原因:
    函数传参的时候,参数是需要压栈的。
    如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
    就如上述结构体有五个整形元素, 在传值调用时可能需要分配20字节的空间,而传址时只需要4个字节就可以(因为在一定的x86的编程环境下指针都是4个字节),所以如果传址调用的话会极大节省内存空间。
    结论:
    结构体传参的时候,最好要传结构体的地址。
    最后期待您的三连,如有错误,欢迎私信或在评论区指正。

  • 相关阅读:
    k8s kubernetes 1.23.6 + flannel公网环境安装
    NodeJS连接MongoDB数据库(数据校验,增删查改)
    权限、认证与授权
    观影《铁拳男人》有感
    C++基础编程100题-012 OpenJudge-1.3-10 计算并联电阻的阻值
    SQL常用数据过滤---IN操作符
    线上数据问题排查案例分享-因为 HMS 和底层 orc 文件中某字段的数据精度不一致造成的数据丢失问题
    查找算法.
    python设计模式(三)--结构类设计模式
    SAP 操作:怎么设定屏幕前台字段显示/编辑
  • 原文地址:https://blog.csdn.net/lzmyyds/article/details/126179119