当前位置: 首页 > news >正文

C语言结构体

目录

一、结构体概念

二、结构体名化简

三、结构体的使用

四、结构体的省略问题


一、结构体概念

在前面的学习中,我们可以很简单的把某一个人的姓名,年龄,身高体重,成绩等信息存储到计算机中,但是如果我们需要存储多个人的各种信息,我们就需要定义很多个变量并赋值,十分的麻烦,这时就需要我们的结构体

结构体就是一种自定义的数据类型,里面可以包含不同的数据类型,对于结构体,我们会用struct关键字来定义一个结构体

我们下面来看看一个简单的结构体如何创建:

比如我们要存储很多个学生的一些基本信息,我们可以这样创建:

struct student {char name[20];float height;int age;int score;
};

这就是一个简单的结构体

注:

①结构体里面的东西(就是用花括号括起来的)叫做结构体的成员变量,这些成员可以是不同的数据类型,比如整型,浮点型,字符型等等

②结构体就是一种你自己定义的一种新的数据类型,比如有的数据类型叫做int,float等,我们上面代码创建的就叫struct student

③结构体和常见的数据类型一样,我们可以通过int a ;来创建一个整型变量a,那么我们也可以通过struct student a,来创建一个结构体变量(前提是先创建好结构体!!)

④当然我们也可以在创建结构体的同时,就把变量创建好,像这样:

struct student {char name[20];float height;int age;int score;
}a;    //注意这个结构体变量a的位置!

⑤使用该数据类型定义一个结构体变量,那么该结构体变量包含结构体里面的各个成员变量

⑥千万不要忘记结构体最后还有一个分号!!!!!!!!!!!!!!!!!!!!!!!

二、结构体名化简

上面提到,我们的struct + 一个东西,才是我们的类型名(比如上面的struct student),这个写起来十分麻烦,所以我们来介绍一个可以化简这个名字的好东西:

typedef化简大法

typedef可以为数据类型起一个新的名字

基本结构:

typedef 原类型名 新类型名;

我们来看一个例子:

typedef struct student {char name[20];float height;int age;int score;
}stu , *stup;    //注意*的位置!!!!!!!1

在上面这个代码中,我们就使用了typedef来把之前的struct student变成了stu,而这个结构体指针就是*stup

注:

①两者之间用逗号分隔

②结构体指针:对于一个普通的数据类型比如int,我们有整形指针即int*,那么我们这个结构体同样有其结构体指针,即struct student*

③上述代码最后一行的*stup中的*,作用就是指明了stup这个就是一个指针,并且必须在stup前面,不能写成stup*

④前后对照

使用typedef前使用typedef后
结构体类型struct studentstu
结构体指针struct student*stup
定义结构体变量astruct student astu a 
定义结构体指针struct student* bstup b

⑤注意④中最后一行,stup已经是一个指针了,如果我们写stup*是一个二级指针,是错误的!

三、结构体的使用

结构体的创建和结构体的使用可以看成两部分,一个是我们用struct关键字来定义的部分,另一个就是在主函数int main()中使用创建的结构体

我们来看两个小示例:

①结构体变量访问结构体成员用"."

#include <stdio.h>typedef struct student {char name[20];float height;int age;int score;
}stu , *stup;int main() {stu a;printf("请输入你的姓名:");scanf_s("%s", a.name, sizeof(a.name));	//不用&,用scanf_s需要sizeof(a.name)a.height = 182.5;a.age = 20;a.score = 150;		//结构体变量访问结构体成员用"."printf("%s , %f , %d , %d" , a.name , a.height , a.age , a.score);return 0;
}

输出:

②结构体指针访问结构体成员用"->"

#include <stdio.h>
#include <stdlib.h>typedef struct student {char name[20];float height;int age;int score;
}stu , *stup;int main() {stup b;b = (stup)malloc(sizeof(stu));printf("请输入你的姓名:");scanf_s("%s", b->name, sizeof(b->name));	//不用&b->height = 182.5;b->age = 20;b->score = 150;		//结构体指针访问结构体成员用"->"printf("%s , %f , %d , %d" , b->name , b->height , b->age , b->score);free(b)return 0;
}

输出:

四、结构体的省略问题

当一个结构体内部包含本结构体的指针成员时,我们的原结构体名字不能省略,而且结构体指针成员也需要使用原结构体名

为什么:程序是自上而下运行的,如果结构体包含一个本结构体指针成员,当运行到指针的那一行代码时,这个结构体还没有运行完(也就是还没被定义完),计算机此时还不认识这个东西,同理,此时如果我们使用typedef,此时也没有完成typedef的操作,新名字还没命名完,计算机也不认识

以上就是C语言结构体的全部内容:)

http://www.dtcms.com/a/276152.html

相关文章:

  • C++---<cctype>
  • 2025科大讯飞AI大赛<大模型技术方向>(Datawhale AI 夏令营)
  • 解决bash终端的路径名称乱码问题
  • Redis渗透思路总结
  • Theo Mandel的用户界面设计三大黄金规则
  • 新手向:使用Python自动化清理指定目录中的临时文件
  • 脉冲神经网络膜电位泄漏系数学习:开启时空动态特征提取的新篇章
  • 实验一 接苹果
  • 配置驱动开发:初探零代码构建嵌入式软件配置工具
  • Windows 用户账户控制(UAC)绕过漏洞
  • 时序分解 | Matlab基于GWO-FMD基于灰狼算法优化特征模态分解-2025-7-12
  • 实现Service和UI通信,并且能够手动回收的解决方案——共享ViewModel
  • 卫星通信终端天线的5种对星模式之二:DVB跟踪
  • C++类模板继承部分知识及测试代码
  • Final
  • 剑指offer——树:二叉树的深度
  • 【C++小白逆袭】内存管理从崩溃到精通的秘籍
  • JVM 中“对象存活判定方法”全面解析
  • JVM的垃圾回收算法和多种GC算法
  • Git 相关的常见面试题及参考答案
  • 人工智能安全基础复习用:可解释性
  • 通过渐进蒸馏实现扩散模型的快速采样
  • Java-线程池
  • 【机器学习实战笔记 16】集成学习:LightGBM算法
  • AV1高层语法
  • PostgreSQL HOT (Heap Only Tuple) 更新机制详解
  • Swin Transformer核心思路讲解(个人总结)
  • 文件上传漏洞2-常规厂商检测限制绕过原理讲解
  • 强化学习、PPO和GRPO的通俗讲解
  • C语言第一章数据类型和变量(下)