【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

简介: 【C 语言】结构体 ( 结构体类型定义 | 结构体类型别名 | 声明结构体变量的三种方法 | 栈内存中声明结构体变量 | 定义隐式结构体时声明变量 | 定义普通结构体时声明变量 )

文章目录

一、结构体类型定义

二、结构体类型别名

三、结构体类型变量声明

1、使用结构体类型 ( 别名 ) 声明变量

2、 定义隐式结构体时声明变量

3、定义普通结构体时声明变量

二、完整代码示例





一、结构体类型定义


使用 struct 关键字 , 定义普通的 结构体类型 , 这是定义了 固定大小内存块别名 , 此时还没有给 结构体 分配内存 ;


声明了 结构体类型 变量后 , 才会在 栈内存 中为其分配内存 ;

使用 malloc 可以在 堆内存 中为其分配内存 ;

/**
 * @brief The Student struct
 * 定义 结构体 数据类型 , 这是定义了 固定大小内存块别名
 * 此时还没有给 结构体 分配内存
 * 声明了 结构体类型 变量后 , 才会在 栈内存中为其分配内存
 * 使用 malloc 可以在堆内存中为其分配内存
 */
struct Student
{
    char name[20];
    int age;
    int id;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
声明上述结构体类型对应的 结构体变量 :
    // 在栈内存中 定义 Student 结构体 类型变量
    struct Student s1;
1
2
二、结构体类型别名
使用 typedef 关键字 , 定义结构体类型别名 , 可以直接使用 别名 结构体变量名 声明结构体类型变量 , 不需要在前面添加 struct 关键字 ;
/**
 * @brief The Teacher struct
 * 定义 结构体 数据类型 , 同时为该结构体类型声明 别名
 * 可以直接使用 别名 结构体变量名 声明结构体类型变量
 * 不需要在前面添加 struct 关键字
 */
typedef struct Teacher
{
    char name[20];
    int age;
    int id;
}Teacher;


使用 结构体类型别名 定义 Teacher 结构体类型变量 :


 

// 使用类型别名 定义 Teacher 结构体类型变量
    Teacher t1;






三、结构体类型变量声明



1、使用结构体类型 ( 别名 ) 声明变量


使用 结构体类型 声明 结构体变量 , 如果没有别名 , 必须使用 struct 结构体类型 变量名 格式 , 声明结构体变量 ;


 

// 在栈内存中 定义 Student 结构体 类型变量
    struct Student s1;


如果结构体类型有别名 , 则可以使用 结构体类型别名 变量名 , 声明结构体变量 ;


 

// 使用类型别名 定义 Teacher 结构体类型变量
    Teacher t



2、 定义隐式结构体时声明变量


定义隐式结构体类型 , 没有结构体名称 , 在结构体结尾直接声明变量名 ;


// 定义隐式结构体类型 , 没有结构体名称
// 在结构体结尾直接声明变量名
struct
{
    char name[20];
    int age;
    int id;
}s2, s3;



3、定义普通结构体时声明变量


定义普通结构体类型的同时定义变量 , 普通的结构体类型后 , 声明结构体类型变量 ;


// III. 定义结构体类型的同时定义变量
// 定义结构体类型的同时 , 定义结构体变量
// 普通的结构体类型后 , 声明结构体类型变量
struct Student2
{
    char name[20];
    int age;
    int id;
}s4, s5;





二、完整代码示例


完整代码示例 :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
 * @brief The Student struct
 * 定义 结构体 数据类型 , 这是定义了 固定大小内存块别名
 * 此时还没有给 结构体 分配内存
 * 声明了 结构体类型 变量后 , 才会在 栈内存中为其分配内存
 * 使用 malloc 可以在堆内存中为其分配内存
 */
struct Student
{
    char name[20];
    int age;
    int id;
};
/**
 * @brief The Teacher struct
 * 定义 结构体 数据类型 , 同时为该结构体类型声明 别名
 * 可以直接使用 别名 结构体变量名 声明结构体类型变量
 * 不需要在前面添加 struct 关键字
 */
typedef struct Teacher
{
    char name[20];
    int age;
    int id;
}Teacher;
// II. 定义隐式结构体类型的同时定义变量
// 定义隐式结构体类型 , 没有结构体名称
// 在结构体结尾直接声明变量名
struct
{
    char name[20];
    int age;
    int id;
}s2, s3;
// III. 定义结构体类型的同时定义变量
// 定义结构体类型的同时 , 定义结构体变量
// 普通的结构体类型后 , 声明结构体类型变量
struct Student2
{
    char name[20];
    int age;
    int id;
}s4, s5;
/**
 * @brief main
 * @return
 */
int main()
{
    // I. 用 类型 定义结构体变量
    // 在栈内存中 定义 Student 结构体 类型变量
    struct Student s1;
    // 使用类型别名 定义 Teacher 结构体类型变量
    Teacher t1;
    // 命令行不要退出
    system("pause");
    return 0;
}




目录
相关文章
|
2月前
|
弹性计算 定位技术 数据中心
阿里云服务器配置选择方法:付费类型、地域及CPU内存配置全解析
阿里云服务器怎么选?2025最新指南:就近选择地域,降低延迟;长期使用选包年包月,短期灵活选按量付费;企业选2核4G5M仅199元/年,个人选2核2G3M低至99元/年,高性价比爆款推荐,轻松上云。
166 11
|
11月前
|
存储 安全 iOS开发
内存卡怎么格式化?6个格式化方法供你选
随着使用时间的增加,内存卡可能会因为数据积累、兼容性或是文件系统损坏等原因需要进行格式化。那么怎样正确格式化内存卡呢?格式化内存卡的时候需要注意什么呢?本文会给大家提供详细的步骤,帮助大家轻松完成格式化内存卡的操作。
|
6月前
|
存储 Windows
内存卡坏了还能修吗?4种常见修复方法
内存卡出现“无法保存”或“存储异常”等问题时,不一定是硬件损坏,可能是系统错误或文件系统异常导致。本文介绍几种亲测有效的修复方法:1) 更换读卡设备排除接触问题;2) 格式化修复文件系统(需先备份数据);3) 使用DiskGenius检测坏道;4) 借助厂商工具深度修复。同时提供日常保养建议,如避免高温环境、养成数据备份习惯,延长内存卡使用寿命。通过这些方法,多数问题可轻松解决,无需更换硬件。
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
724 62
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
1127 13
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
393 12
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
308 6
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
353 5
|
编译器 Go
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
150 3
|
3月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
985 0