黑马程序员--c语言:结构体、枚举、预处理指令、typedef、static与extern、递归思想

本文详细介绍了C语言中结构体与枚举的概念、定义及应用。包括结构体的定义、内存分析、结构体数组与指针的使用、结构体与函数的交互、结构体嵌套等核心知识点,并探讨了枚举类型的定义与使用。

一、结构体

1.定义结构体

 struct Person

{ // 里面的3个变量,可以称为是结构体的成员或者属性

        int age; // 年龄

        double height; // 身高

        char *name; // 姓名

};

 

2.定义结构体变量的3种方式

2.1 先定义类型,再定义变量(分开定义)

 struct Student

 {

    int age;

 };

 struct Student stu;

 

2.2定义类型的同时定义变量

 struct Student

 {

    int age;

 } stu;

 struct Student stu2;

 

2.3定义类型的同时定义变量(省略了类型名称)

 struct

 {

    int age;

 } stu;

 

 

3.结构体的内存分析

3.1定义结构体类型(并不会分配存储空间)

struct Date

{

        int year;

        int month;

        int day;

};

 

3.2定义结构体变量(真正分配存储空间)

struct Date d1 = {2011, 4, 10};

struct Date d2 = {2012, 8, 9};   

 

3.3会将d1所有成员的值对应地赋值给d2的所有成员

d2 = d1;

d2.year = 2010;

 

4.补齐算法

 struct Student

{

        int age;// 4个字节

        

        char a;

        

        //char *name; // 8个字节

};

    

    struct Student stu;

    //stu.age = 20;

    //stu.name = "jack";

    // 补齐算法(对齐算法)

    // 结构体所占用的存储空间 必须是 最大成员字节数的倍数

    

    int s = sizeof(stu);

    printf("%d\n", s);

 

5.结构体数组

struct RankRecord

{

        int no; // 序号  4

        int score; // 积分 4

        char *name; // 名称 8

};

struct RankRecord records[3] =

{

        {1, "jack", 5000},

        

        {2, "jim", 500},

        

        {3, "jake",300}

};

records[0].no = 4;

 

 

6.结构体指针

6.1指向结构体的指针的定义

 struct Student *p;

 例:

 struct Student

{

        int no;

        int age;

};

// 结构体变量

struct Student stu = {1, 20};

   

// 指针变量p将来指向struct Student类型的数据

struct Student *p;

    

// 指针变量p指向了stu变量

p = &stu;

 

6.2利用指针访问结构体的成员

 1> (*p).成员名称

 2> p->成员名称

 例:

    // 第一种方式

    printf("age=%d, no=%d\n", stu.age, stu.no);

    

    // 第二种方式

    printf("age=%d, no=%d\n", (*p).age, (*p).no);

    

    // 第三种方式

    printf("age=%d, no=%d\n", p->age, p->no);

    

7.结构体和函数

//如果结构体作为函数参数,只是将实参结构体所有成员的值对应地赋值给了形参结构体的所有成员

//修改函数内部结构体的成员不会影响外面的实参结构体

struct Student

{

    int age;

    int no;

};

 

struct Student stu = {28, 1};

 

 

void test(struct Student s)

{

    s.age = 30;

    s.no = 2;

}

 

// 会影响外面的实参结构体

void test2(struct Student *p)

{

    p->age = 15;

    p->no = 2;

}

8.结构体嵌套

 

 struct Date

{

        int year;

        int month;

        int day;

};

      

    // 类型

struct Student

{

        int no; // 学号

        

        struct Date birthday; // 生日

        

        struct Date ruxueDate; // 入学日期

        

        // 这种写法是错误的

        //struct Student stu;

};

struct Student stu = {1, {2000, 9, 10}, {2012, 9, 10}};

 

二、枚举

 1.定义枚举类型

enum Season

{

        spring,

        summer,

        autumn,

        winter

};

    

2.定义枚举变量并初始化

enum Season s = summer;

 

三、预处理指令

1.宏定义

1.1常量的宏定义

#define COUNT 4

 

1.2带参数的宏定义

#define sum(v1, v2) ((v1)+(v2))

#define pingfang(a) ((a)*(a))

 int c = pingfang(5+5)/pingfang(2);

int c = sum(2, 3) * sum(6, 4);

 

2.条件编译

#if (A == 10)

    printf("a是10\n");

#elif (A == 5)

    printf("a是5\n");

#else

    printf("a其他值\n");

#endif

 

3.文件包含

例:

lisi.c文件内容如下:

int sum(int a, int b)

{

    return a + b;

}

 

lisi.h文件内容如下:

#ifndef LISI_H

#define LISI_H

int sum(int a, int b);

#endif

 

zhangsan.c文件内容如下:

#include "lisi.h"

#include "wangwu.h"

#include <stdio.h>

 

int main()

{

    int c = sum(10, 19);

    printf("c is %d\n", c);

    

    return 0;

}

 

 四、typedef

1.用于基本数据类型

typedef int MyInt;

 

2.用于指针

typedef char * String;

 

3.用于结构体

struct Student

{

    int age;

};

typedef struct Student MyStu;

 

4.用于枚举

typedef enum {

    Man,

    Woman

} MySex;

 

 

5.用于指向函数的指针

typedef int (*MyPoint)(int, int);

int minus(int a, int b)

{

    return a - b;

}

MyPoint p= minus;

int m = p(2,3);

 

6.指向结构体的指针

 

typedef struct Person

{

    int age;

} * PersonPoint;

 

// 定义结构体变量

struct Person p = {20};

PersonPoint p2 = &p;

 

五、static与extern

1.static和extern对函数的作用

外部函数:定义的函数能被本文件和其他文件访问

 1> 默认情况下所有函数都是外部函数

 2> 不允许有同名的外部函数

 

 内部函数:定义的函数只能被本文件访问,其他文件不能访问

 1> 允许不同文件中有同名的内部函数

 

 static对函数的作用:

 1> 定义一个内部函数

 2> 声明一个内部函数

 例:

static void test2();

static void test2()

{

    

}

 extern对函数的作用:

 1> 完整地定义一个外部函数

 2> 完整地声明一个外部函数

 (extern可以省略,默认情况下声明和定义的函数都是外部函数)

 

 

2.static和extern对变量的作用

 全局变量分2种:

 外部变量:定义的变量能被本文件和其他文件访问

 1> 默认情况下,所有的全局变量都是外部变量

 2> 不同文件中的同名外部变量,都代表着同一个变量

 

 内部变量:定义的变量只能被本文件访问,不能被其他文件访问

 1> 不同文件中的同名内部变量,互不影响

 

 

 static对变量的作用:

 定义一个内部变量

 static int b;

 

 extern对变量的作用:

 声明一个外部变量

 extern int a;

 

 

 static修饰局部变量的使用场合:

 1.如果某个函数的调用频率特别高

 2.这个函数内部的某个变量值是固定不变的

 

 static修饰局部变量:

     1> 延长局部变量的生命周期:程序结束的时候,局部变量才会被销毁

     2> 并没有改变局部变量的作用域

     3> 所有的test函数都共享着一个变量b

 

void test()

{

    static double pi = 3.14;

    

    double zc = 2 * pi * 10;

    

    int a = 0;

    a++;

    printf("a的值是%d\n", a); 

    static int b = 0;

    b++;

    printf("b的值是%d\n", b); // 3

}

  

 

六、递归思想

/*

 pow2(b, 0) == 1

 pow2(b, 1) == b == pow2(b, 0) * b

 pow2(b, 2) == b*b == pow2(b, 1) * b

 pow2(b, 3) == b*b*b == pow2(b, 2) * b

 

 1> n为0,结果肯定是1

 2> n>0,pow2(b, n) == pow2(b, n-1) * b

 */

 

int pow2(int b, int n)

{

    if (n <= 0) return 1;

    return pow2(b, n-1) * b;

}

int main()

{

    int c = pow2(3, 2);

    

    printf("%d\n", c);

    return 0;

}

 

 

 

 

 

Beyond Compare是一款文件差异比较工具的文件和文件夹比较工具,使用该工具可以可视化和调整差异, 合并修改,同步文件夹。支持文件夹比较,文件夹合并和同步,文本比较,表格比较,图片比较,16进制比较,注册表比较,版本比较等;调整差异,合并修改,内置文件浏览器可以针对文件、文件夹之间的差异对比及上传同步。 Beyond Compare 5.0.4.30422是一款先进的文件和文件夹比较工具,它能够帮助用户高效地识别和管理文件差异,支持多种文件类型和格式的比较。使用Beyond Compare,用户可以轻松地对文件夹内容进行同步,无论是进行简单的文件复制还是复杂的项目同步任务。此外,该工具还具备了高级的文件比较功能,如文本比较、表格比较、图片比较、16进制比较以及注册表比较,覆盖了从纯文本到二进制文件的广泛使用场景。 对于文本文件的比较,Beyond Compare提供了语法高亮和行号等辅助功能,让用户在审查代码或文档时能更快地定位差异点。表格比较功能则特别适用于数据分析和处理任务,可以快速识别两个Excel电子表格之间的不同之处。在进行图片文件的比较时,用户可以通过直观的视图了解图片之间的微小差别,这在图像处理和质量控制中尤其有用。 此外,16进制比较功能为开发者提供了深入分析二进制文件差异的手段,无论是在软件开发还是在数据恢复方面都大有裨益。注册表比较则专注于Windows系统的核心配置文件,帮助IT专业人员快速定位系统配置的变化,这对于系统维护和故障排除尤其重要。 Beyond Compare内置的文件浏览器允许用户在一个界面内完成文件的浏览、比较和同步操作,极大的提高了工作效率。内置的差异调整和合并修改功能让同步文件夹的工作更加精确和便捷。用户可以针对不同的文件和文件夹进行个性化设置,实现定制化的比较和同步策略。
内容概要:本文介绍了一种基于Simulink的发电机故障暂态仿真模型,旨在深入研究发电机在发生各类短路故障(如单相接地、两相短路接地及两相相间短路)时电压电流的动态变化特性。该模型精确构建了发电机及其保护系统的电气结构,能够有效模拟故障瞬间的暂态响应过程,全面分析不同接地方式(中性点不接地、经小电阻接地、经消弧线圈接地)对系统电气量的影响。通过仿真获取的电压、电流波形数据,可用于评估电力系统的暂态稳定性、验证继电保护装置的动作逻辑灵敏性,并为系统控制策略优化及故障诊断提供理论支撑和技术依据。; 适合人群:电气工程及其自动化、电力系统及其相关专业的高校本科生、研究生、科研人员,以及从事电力系统仿真分析、继电保护设计、电网运行维护等工作的工程技术人员。; 使用场景及目标:①用于高校教学科学研究中对发电机故障机理及暂态过程的可视化分析深入探讨;②支撑电力系统安全稳定分析、保护定整定计算、控制策略优化应急预案制定;③为实际电网故障后的诊断溯源、事故回溯应急处置决策提供可靠的仿真平台理论指导。; 阅读建议:建议读者结合MATLAB/Simulink仿真环境进行实践操作,按照文档指导逐步搭建仿真模型,设置不同类型的故障条件进行对比实验,重点观察并分析电压、电流波形的幅、相位及衰减特性,深入理解其物理成因系统影响,有条件者可进一步将模型扩展至多机系统以提升研究的工程应用价
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 在信息技术行业,特别是智能手机维修和改进的范畴内,“高通9008免拆机救黑砖教程工具”被视为一种通用的处理手段,它主要服务于那些面对设备无法正常运作或处于“黑砖”状态的消费者。这个压缩文件内含针对搭载高通处理器的智能手机的救援指南实用工具,其核心目标在于协助用户在不进行物理拆解的前提下,成功进入9008模式,进而完成对手机的修复。 我们必须明确理解“高通9008模式”的概念。9008代表了高通芯片的一种下载状态,也称作EDL(eMMC Download Mode)。在该状态下,用户或技术人员能够直接对手机的存储单元进行编程操作、系统升级或固件回载,以此应对软件层面的故障。此类模式一般应用于手机无法正常启动或遭遇严重故障的场合,属于一种较为根本性的修复措施。 “黑砖”状态描述了手机因软件层面的异常而无法开机或完全失去反应的情况,其成因通常涉及系统崩溃、刷机失败、恶意软件入侵等。当常规的恢复措施如强制重启、恢复界面等手段均告无效时,就需要借助9008模式这类特殊通道来实施修复。 小米品牌手机广泛采用了高通处理器,因此当其产品遭遇黑砖问题时,该教程工具显示出极大的实用价。此压缩文件可能包含以下组成部分: 1. **救砖教程**:提供详尽的流程说明,引导用户如何安全地将设备导入9008模式,以及如何运用相关工具执行固件恢复或刷新操作。 2. **驱动程序**:高通9008模式的有效运行依赖于特定的驱动程序以实现电脑的通信,压缩包中或许就整合了这些驱动,用户需先行安装它们以便连接手机并开展修复工作。 3. **线刷工具**:诸如MiFlash、QFIL等工具,它们能够支持用户通过...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值