C语言进阶-自定义类型:结构体、枚举、联合(上)

简介: C语言进阶-自定义类型:结构体、枚举、联合(上)

一、结构体的声明



1.1 结构的基础知识


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


1.2 结构的定义


struct tag
{
    member - list;//成员列表
}variable - list;//变量列表


示例:表述学生的信息


struct stu
{
    char  id[12];
    char name[20];
    char sex[10];
    short age[4];
}


1.3 特殊定义


struct
{
        int a ;
        char b ;
        float c ;
} x ;
struct
{
        int a ;
        char b ;
        float c ;
}   * p ;

若p=&x,编译器会将上面的两个定义当成不同的两个类型


1.4 结构自引用


结构中包含一个结构体本身的成员。


struct Node
{
    int date;//数据域
    struct Node* next;//指针域
};
typedef struct  Node
{
        int date;//数据域
        struct Node* next;//指针域
}Node;


29bf9055ccba46478c0f5572f14f6709.png


1.5 结构体变量和初始化


struct stu
{
    char id[12];
    char name[20];
    char sex[10];
    short age[4];
} stu1;///定义类型同时定义变量stu1
struct stu stu2;//定义结构体变量stu2
struct stu stu3={“1234567890”,“张三”,“男”,21};//定义结构体变量时初始化
struct Point
{
    int a;
    int b;
};
struct Node
{
    int data;
    struct Point p;
    struct Node* next;
}n1 = { 10,{4,5},NULL}; //结构体嵌套初始化
struct Node n2 = { 20, {5, 6},NULL};//结构体嵌套初始化


1.6 结构体内存对齐


#include<stdio.h>
struct s1
{                  
    char a1;  
    int a2;
    char a3; 
};
struct s2
{
    char a1;
    char a3;
    int a2;
};
int main()
{
    printf("%d", sizeof(struct s1));
    printf("%d", sizeof(struct s2));
}


输出


85bca6b50ee64131bec97e95b7c8c231.png


struct s1:


afceee594f3749b8821fe49c6e0a5528.png

struct s2:

0a05b644a26c48efba4ed055d7323207.png

struct s3//结构体嵌套
{
    char c1;
    struct s2 s2;
    double d;
}


输出


c562127d4fdf45e9a13c1740d0f71f97.png


0d31b91566914de9a781266f61ff8b16.png


结构体对齐规则:


               1. 第一个成员在与结构体变量偏移量为0的地址处。


               2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。


                    对齐数=成员的大小与编译器默认对齐数中的较小值


                      vs默认值为8,Linux没有默认对齐数,对齐数为成员大小


               3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。                                     4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处结构                          体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。


存在内存对齐的原因:


               1.平台原因:不是所有的硬件平台都能访问任意地址上的任意数据;某些硬件平台只                        能在某些地址处取某些特定类型的数据,否则抛出硬件异常。


               2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。为了访问未对齐的                       内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。


注意:结构体的内存对齐是用空间来换时间。


1.7 修改默认对齐数


#include <stdio.h>
#pragma pack(1)//设置默认对齐数为1
struct s1
{
    char c1;
    int i;
    char c2;
};
int main()
{
    //printf("%d\n", sizeof(struct s1));
    //printf("%d\n", sizeof(struct s2));
    printf("%d", sizeof(struct s1));
    return 0;
}


输出


dddf8a217fc946f4bd19681e11515ae5.png


#pragma pack() //取消设置的默认对齐数,还原为默认


1.8 结构体传参


struct S
{
        int data [ 1000 ];
        int num ;
};
//结构体传参
void print1(struct S s)
{
        printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
        printf("%d\n", ps->num);
}
int main()
{
    struct S s = { {1,2,3,4},100 };
    print1(s);
    print2(&s)
    return 0;
}

输出


a368fe655f4b4d3aa0fea176f25a3117.png


目录
相关文章
|
17天前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
87 14
|
21天前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
90 10
|
25天前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
1月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
105 13
|
1月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
60 11
|
C语言
《C语言及程序设计》实践项目——枚举应用
返回:贺老师课程教学链接 【项目1-对称点】 设计函数,可以按指定的方式,输出一个平面点的对称点 下面给出枚举类型定义和main函数(测试函数),请写出output函数的实现。 #include&lt;stdio.h&gt; enum SymmetricStyle {axisx, axisy, point};//分别表示按x轴, y轴, 原点对称三种方式 void
1095 0
|
21天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
40 10
|
21天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
42 9
|
21天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
32 8
|
21天前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
41 6