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


目录
相关文章
|
1月前
|
C语言
【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】
本文档介绍了编程任务的详细内容,旨在运用枚举法求解硬币等额 - 循环控制语句(`for`、`while`)及跳转语句(`break`、`continue`)的使用。 - 循环嵌套语句的基本概念和应用,如双重`for`循环、`while`嵌套等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台将对编写的代码进行测试,并给出预期输出结果。 5. **通关代码**:提供完整的代码示例,帮助理解并完成任务。 6. **测试结果**:展示代码运行后的实际输出,验证正确性。 文档结构清晰,逐步引导读者掌握循环结构与嵌套的应用,最终实现硬币兑换的程序设计。
51 19
|
1月前
|
C语言
【C语言程序设计——枚举】得到 3 种不同颜色的球的可能取法(头歌实践教学平台习题)【合集】
本关任务要求从红、黄、蓝、白、黑五种颜色的球中,每次取出3个不同颜色的球,列举所有可能的排列情况。通过定义枚举类型和使用嵌套循环语句实现。枚举类型用于表示球的颜色,循环语句用于生成并输出所有符合条件的排列 编程要求:在指定区域内补充代码,确保输出格式正确且完整。测试说明:平台将验证代码输出是否与预期一致,包括每种排列的具体顺序和总数。 示例输出: ``` Output: 1 red yellow blue 2 red yellow white ... 60 black white blue total: 60 ```
49 4
|
2月前
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
194 14
|
2月前
|
存储 编译器 C语言
【C语言】结构体详解 -《探索C语言的 “小宇宙” 》
结构体通过`struct`关键字定义。定义结构体时,需要指定结构体的名称以及结构体内部的成员变量。
208 10
|
3月前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
3月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
267 13
|
C语言
《C语言及程序设计》实践项目——枚举应用
返回:贺老师课程教学链接 【项目1-对称点】 设计函数,可以按指定的方式,输出一个平面点的对称点 下面给出枚举类型定义和main函数(测试函数),请写出output函数的实现。 #include&lt;stdio.h&gt; enum SymmetricStyle {axisx, axisy, point};//分别表示按x轴, y轴, 原点对称三种方式 void
1102 0
|
1月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
62 23
|
1月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
66 15
|
1月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
60 24

热门文章

最新文章