• C语言之结构体的有关知识


    结构体的声明:

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

    //定义结构体类型
    struct tag//struct结构体关键字 tag结构体标签 struct tag结构体类型
    {
    	//成员变量
    	char name[20];
    	short age;
    	char telphone[12];
    	char sex[5];
    }s1,s2,s3;//s1,s2,s3是三个全局结构体变量
    int main()
    {
    	struct tag s;//s是局部变量
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    小tips:结构体类型是不占内存空间的,-相当于int在C语言中也是不占内存的,而int a(定义a变量后就会占据内存)

    使用typedef定义一个单独的变量,因为我们在编写代码的过程中,重复的书写struct会感觉很繁琐,这样定义之后就可以直接使用改变量作为结构体类型。
    举例:

    typedef struct tag//定义tag为结构体别名,tag等价于struct tag
    {
    	char name[20];
    	short age;
    	char telphone[12];
    	char sex[5];
    }tag;//tag指的是类型,而不是变量
    int main()
    {
    	struct tag s1;
    	tag s2;//struct tag==tag,因此tag可以直接使用
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    结构体成员的类型:

    结构体成员的类型可以是标量,数组,指针。其他结构体。

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

    #include <stdio.h>
    typedef struct tag
    {
    	//结构体成员类型的定义
    	char name[20];
    	short age;
    	char telphone[12];
    	char sex[5];
    }tag;
    int main()
    {
    	tag s1={"张三",20,"15372842487"};//结构体变量的初始化
    	printf("%s的年龄是%d,手机号码为%s\n", s1.name, s1.age, s1.telphone);//输出有关该成员的信息,通过结构体变量找对应的成员变量
    	struct tag s2={"lisa",19,"8725111"};
    	printf("%s的年龄是%d,手机号码为%s", s2.name, s2.age, s2.telphone);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    结构体成员的访问:

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

    struct stu
    {
    	char name[20];
    	int age;
    }s1={"张三",19};
    int main()
    {
    	printf("%s的年龄是%d", s1.name, s1.age);//s1.name和s1.age就是 通过点操作符访问结构体成员
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    张三的年龄是19
    
    • 1

    结构体传参数的时候,要传结构体的地址,其原因是函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,因此会导致性能下降。
    举例:

    typedef struct stu
    {
    	char name[20];
    	int age;
    }stu;
    void print1(stu tmp)//传递结构体的值
    {
    	printf("name:%s\n", tmp.name);
    	printf("age:%d\n", tmp.age);
    }
    void print2(stu* ps)//传递结构体的地址,开辟的空间为一个指针的大小(4/8个字节)
    {
    	printf("name:%s\n", ps->name);
    	printf("age:%d\n", ps->age);
    }
    int main()
    {
    	stu s = { "张三",19 };
    	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
    name:张三
    age:19
    name:张三
    age:19
    
    • 1
    • 2
    • 3
    • 4

    这里插播一点数据结构的知识:数据结构分为线性数据结构(顺序表,链表,栈,队列)和树形数据结构(二叉树,图)。
    顺序表:按照一定的顺序将元素储存起来。
    举例:在这里插入图片描述
    链表:用一条线将元素连接起来,不要求元素都在同一条线上。
    举例:
    在这里插入图片描述
    栈:元素先进后出,后进先出,元素的出入方式类似于手电筒中的电池一样,向一个不含任何元素的栈中放入一个元素的过程叫压栈,删除栈中的一个元素的过程,叫出栈,栈中元素的删除也是由栈顶乡下进行删除,因此如果想删除栈中元素,不能直接删除,必须将在该元素后面放入的元素都进行删除。
    举例:
    在这里插入图片描述
    实例分析:

    int add(int x, int y)
    {
    	int z = 0;
    	z = x + y;
    	return z;
    }
    int main()
    {
    	int a = 10;
    	int b = 20;
    	int ret = 0;
    	ret = add(a, b);
    	printf("%d\n",ret);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    30
    
    • 1

    在这里插入图片描述函数在调用的时候,实参的传递顺序是从右到左,将a,b放入x,y的过程叫压栈。

  • 相关阅读:
    UDP网络编程
    java计算机毕业设计高校社团管理系统MyBatis+系统+LW文档+源码+调试部署
    Mybatis框架
    阿里35+老测试员生涯回顾,自动化测试真的有这么吃香吗?
    github pages 部署单页面
    空间金字塔池化改进 SPP / SPPF / ASPP / RFB / SPPCSPC
    亚马逊收到CPSC查验通知后卖家需要怎么弄?ASTM F963标准测试 ,CPC认证
    TQ210-Bootloader-Uboot(LTS)
    【C++】字典序:比较字符串或序列
    ElasticSearch-Head 数据浏览406问题解决
  • 原文地址:https://blog.csdn.net/m0_64365419/article/details/125548175