【C语言初阶篇】自定义类型结构体我不允许还有人不会!(上)

简介: 【C语言初阶篇】自定义类型结构体我不允许还有人不会!

📋 前言

  🌈hello! 各位宝子们大家好啊,前面我们学完指针了就正式进入到结构体这一章节了。

  ⛳️结构体使我们自定义类型的一种,应用可以说非常广泛了。今天就给大家大家详细解析一下,结构的内容详解以及各种注意事项!

  📚本期文章收录在 《C语言初阶》,大家有兴趣可以看看呐

  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

1 . 什么是结构体

  ⛳️ 关于结构体我们可以这样理解,数组是一些相同元素的集合,那么结构体就是不同类型值的的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

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

1.1 结构的定义

那么结构体该如何定义呢?结构体其实就和 int 整形是一模一样的,结构体也是一个类型。想定义一个结构体变量首先需要先声明这个结构的类型成员是那些!

  • 结构体的声明关键字:struct
  • 下面我们就来看一下结构体是如何声明的吧!

1.2 结构的声明

📚 结构体的语法形式:

struct tag
{
  member - list;
}variable - list;

结构体的关键字struct 后面跟的 tag 是 结构体的标签名,可以自定义。我们也根据实际情况自定义!

  • member - list大括号里面需要的就是我们成员列表了
  • 为什么叫成员列表,因为结构体里面可以一个或多个不同类型的成员
  • variable - list这个是变量列表的意思

可能各位,铁汁还是不明白。我们来看一下实际例子大家就明白了!例如描述一个学生:

  • 学生那就需要 姓名年龄性别学号
  • 而结构体刚好可以满足不同类型的变量

📚 代码演示:

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

总结:

  • 结构体定义需要,结构体关键字,结构体标签名。
  • 成员变量的类型和名字
  • 和结构体后面的分号。

2.结构体初始化

2.1 用标签名定义和初始化

结构体类型的声明和定义都回了。那么一个结构体类型我们该怎么创建一个结构体的变量呢?答案是使用结构体的标签名用来定义结构体变量,或者在创建结构体的时候直接在后面跟上结构体变量

  • 在声明结构体是创建的结构体变量是 全局变量
  • 在大括号里面创建的结构体是 局部变量

📚 代码演示:

struct Point
{
  int x;
  int y;
}p1; //声明类型的同时定义变量p1
//全局变量
int main()
{
  struct Point p2;//直接使用标签名定义
  //局部变量
  return 0;
}

而初始化的话也非常简单和数组是差不多的每个成员赋值用大括号扩起来,单引号隔开就好了!

  • 大括号括起来,后面加引号
  • 每个成员逗号隔开

📚 代码演示:

struct Point
{
  int x;
  int y;
}p1 = { 2, 1 };//创建时直接赋值
int main()
{
  struct Point p2 = {12,13};//直接使用标签名定义
              //然后进行赋值     
  return 0;
}

2.2 typedef 的结构体定义

这时候大家就会发现诶呀!结构体的变量的定义也太麻烦了吧!还要写结构体的关键字和标签名一点也不简便!那么有没有简便的方法呢!这时候就需要用到 typedef 重命名关键字来重新定义结构体名称了!

  • 使用 typedef 重命名结构体后,结构体大括号后面跟的第一个变量就是结构体重命名后的类型名!
  • 而我们想要在定义的话只需要写出重命名之火后的类型名就好了非常便捷!

📚 代码演示:

#include <stdio.h>
typedef struct Point
{
  int x;
  int y;
}Pt;//重定义后的类型名
int main()
{
  Pt p2 = { 12,13 };//typedef重定义类型名定义
  //结构体变量然后进行赋值    
  return 0;
}

📑 代码结果:

2.3 typedef 的结构体初始化

typedef 的结构体初始化和标签名初始化一模一样但是,不能和标签名一样在结构体类型的最后一行直接创建结构体变量和初始化了。

  • typedef 重命名了,在声明后面就不能再创建我们的结构体变量了
  • 因为typedef 的定义结构体后面默认跟的是重命名的类型名。

📚 代码演示:

#include <stdio.h>
typedef struct Stu
{
  char name[20];//姓名
  int age;//年龄
  char sex[5];//性别
  char id[20];//学号
}Stu;
//全局变量
Stu p1 = { .id = "20202356",.age = 18, .name = "lisi",.sex = "nan" };
int main()
{
  printf("姓名\t年龄\t性别\t学号\n");
  //局部变量
  Stu p2 = { .id = "202329",.age = 20, .name = "zhangsan",.sex = "nan" };
  printf("%-10s\t %d\t %s\t %s\n", p1.name, p1.age, p1.sex, p1.id);
  printf("%-10s\t %d\t %s\t %s\t", p2.name, p2.age, p2.sex, p2.id);
  return 0;
}

📑 代码结果:


目录
相关文章
|
22天前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
30 10
|
21天前
|
安全 编译器 Linux
【c语言】轻松拿捏自定义类型
本文介绍了C语言中的三种自定义类型:结构体、联合体和枚举类型。结构体可以包含多个不同类型的成员,支持自引用和内存对齐。联合体的所有成员共享同一块内存,适用于判断机器的大小端。枚举类型用于列举固定值,增加代码的可读性和安全性。文中详细讲解了每种类型的声明、特点和使用方法,并提供了示例代码。
19 3
|
21天前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
26天前
|
编译器 C语言
共用体和结构体在 C 语言中的优先级是怎样的
在C语言中,共用体(union)和结构体(struct)的优先级相同,它们都是用户自定义的数据类型,用于组合不同类型的数据。但是,共用体中的所有成员共享同一段内存,而结构体中的成员各自占用独立的内存空间。
|
26天前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
30天前
|
编译器 C语言 C++
C语言结构体
C语言结构体
25 5
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
6天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
21 6
|
26天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10
|
19天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。