当前位置: 首页 > news >正文

C语言基础⑩——构造类型(结构体)

一、数据类型分类

1、基本类型

  • 整数型

  1. 短整型:short(2个字节);
  2. 整型(默认):int(4个字节);
  3. 长整型:long(8个字节);
  4. 长长整型:long long;
  • 浮点型

  1. 单精度:float(4个字节);
  2. 双精度:double(8个字节);
  • 字符型:char(1个字节)

2、指针类型

  • 数据类型*:int* ,char* ,float*等;
  • void*:任意数据类型的指针

3、空类型

  • void:没有返回值或没有形参(不能定义变量(定义变量的目的是存储数据

4、自定义类型/构造类型

  • 结构体类型:struct;
  • 共用体类型(联合体):union;
  • 枚举类型:enum;

注意:整数型和字符型分有符号signed和无符号unsigned,默认是有符号,有符号可以省略关键字signed。

二、结构体数组

  • 定义:自定义数据类型的一种,关键字 struct ,结构体类型的变量可以存储多个不同数据类型的数据。

  • 定义格式:

    struct 结构体名
    {数据类型1 成员名称1;
    }

    注意:结构体中定义的变量,我们称之为成员变量

  • 格式说明:

  1. 结构体名:合法的标识符,建议单词的首字母大写
  2. 数据类型n:C语言支持的所有类型;
  3. 成员名称:合法的标识符,就是变量的命名标准
  4. 数据类型n 成员名称n:类似于定义变量,定义了结构体中的成员
  • 注意:

  1. 结构体在定义的时候,成员不能赋值;
  2. 举例:
    struct Cat
    {int age = 5;//错误,结构体定义时,成员不能赋值double height;//正确
    }

1、常见的定义格式:

  1. 方式1:常规定义(只定义类型)---推荐(定义的结构体只是模板,无实际数据)
    struct Student//常规定义,命名结构体
    {int num;//学号char name[20];//姓名char sex;//性别int age;//年龄char address[100];//家庭住址
    }
  2. 方式2:定义匿名结构体(常用于作为其他结构体的成员使用)
struct Dog
{char *name;//姓名int age;//年龄struct//匿名结构体{int year;//年int month;//月int day;//日}birthday;//变量名
};

注意:定义匿名结构体的同时必须定义结构体变量,否则编译报错,结构体可以作为另一个结构体的成员。

总结:

  1. 结构体可以定义在局部位置,也可以定义在全局位置;
  2. 全局位置的结构体名和局部位置的结构体名可以相同,就近原则(和普通变量的定义同理)。
  • 结构体类型的使用:利用结构体类型定义变量,定义数组:结构体类型的使用与基本数据类型的使用类似。

2、结构体变量的定义:

  • 三种形式定义结构体变量:

        结构体变量也称为结构体的实力。

        1.第一种

                ①先定义结构体;

                ②然后使用 struct 结构体名 变量名;

//先定义结构体(先定义结构体这个数据类型)
struct A
{int a;char b;
}//定义结构体变量
struct A x;
struct A y;
        2.第二种

        在定义结构体同时,定义结构体变量:

//定义结构体的同时定义结构体变量
struct A
{int a;char b;
}x;

        此时定义了一个结构体A,x是这个结构体类型的变量。

        3.第三种:不推荐

        在定义匿名结构体的同时,定义结构体变量:

struct
{int a;char b;
}x,y;

此时定义了一个没有名字的结构体(成为匿名结构体);y,x是这个匿名结构体类型的变量;

  • 匿名结构体:---弊大于利

  1. 优点:少写一个结构体名称;
  2. 缺点:只能使用一次:定义的结构体类型的同时就必须定义变量
  3. 应用场景:

                ①当结构体的类型只需要使用一次,并且定义类型的同时定义变量;

                ②作为其他结构体的成员使用。

  • 定义结构体的同时,定义结构体变量初始化

    struct Cat
    {int age;char color[20];
    }cat;
  1. 结构体成员部分初始化时,大括号不能省略。
  2. 如果赋值没有歧义,编译就会报错;
  3. 如果赋值推导有歧义,编译就会报错;
  4. 结构体的成员,没有默认值,是不确定的数。
举例:结构体变量的定义格式
 /*** 结构体变量的定义*/
#include <stdio.h>
// 先定义结构体,再定义结构体变量
void fun1()
{// 先定义结构体struct A{int a;char b;};// 再定义结构体变量struct A x;struct A y;
}
// 定义结构体的同时定义结构体变量
void fun2()
{struct A{int a;char b;} x,y;struct A z;
}
// 定义匿名结构体的同时定义结构体变量
void fun3()
{struct{int a;char b;} x,y;struct{int a;char b;} z;
}
int main()
{fun1();fun2();fun3();return 0;
}

3、结构体变量的使用

  • 结构体变量访问结构体成员

  1. 格式
    结构体变量名.成员名;

    可以通过访问给成员赋值(存数据);可以通过访问获取成员的值(取数据)

  2. 结构体变量未初始化,结构体的成员值随机(不确定)
  • 结构体变量在定义时,可以初始化

  1. 建议用大括号标明数据的范围;
  2. 结构体这个成员初始化时,可以部分初始化,部分初始化时一定要带大括号标明数据的范围
  • 举例:结构体变量的初始化

     /*** 结构体变量的初始化*/
    #include <stdio.h>
    /* 全局的结构体(数据类型) */
    struct Dog
    {char *name;// 姓名int age;// 年龄char sex;// M:公,W:母
    };
    /* 先定义,再初始化 */
    void fun1()
    {// 定义一个结构体// struct Dog// {//   char *name;// 姓名//   int age;// 年龄//   char sex;// M:公,W:母// };// 定义结构体变量struct Dog dog;// 给结构体变量的成员赋值dog.name = "旺财";dog.age = 5;// 访问结构体变量的成员printf("%s,%d,%c\n",dog.name,dog.age,dog.sex);
    }
    /* 定义的同时初始化 */
    void fun2()
    {// 定义结构体变量并初始化struct Dog dog = {"招财",23,'M'};// 修改成员的值dog.name = "进宝";// 访问结构体变量的成员printf("%s,%d,%c\n",dog.name,dog.age,dog.sex);}
    int main()
    {fun1();fun2();return 0;
    }
    

4、结构体数组的定义

  • 什么时候需要结构体数组?

        比如:我们需要管理一个学生对象,只需要定义一个 struct Student{...};

        假如:我们需要管理多个学生对象,此时就需要一个结构体的数组 struct Student students[64];

  • 三种形式定义结构体数组

  1. 第一种:先定义结构体类型,然后定义结构体变量,再将变量存储在结构体数组中
    //定义一个学生类型的结构体
    struct Student
    {char *name;int age;float scores[3];//三门课程的成绩
    }//定义结构体对象
    struct Student zhangsan = {"张三",23,{67.5,43.0,90.0}};
    struct Student lisi = {"李四",21,{22.4,65.7,98.0}};//定义结构化数组
    struct Student students[3] = {zhangsan,lisi};
  2. 第二种:定义结构体类型,然后定义结构体数组并初始化
     // 定义一个学生类型的结构体
    struct Student
    {int id;char *name;int age;float scores[3];// 三门课程的成绩
    };
    // 定义结构体数组并初始化
    struct Student students[3] = {{1,"张三",23,{67.5,89.0,90.0}},// 注意:这里赋值的顺序需要跟成员在结构体中的顺序一致{2,"李四",21,{77.0,80.0,85.0}}
    };
    
  3. 第三种:定义结构体类型同时定义结构体数组并初始化
     // 定义一个学生类型的结构体
    struct Student
    {int id;char *name;int age;float scores[3];// 三门课程的成绩
    } students[3] = {{1,"张三",23,{67.5,89.0,90.0}},// 注意:这里赋值的顺序需要跟成员在结构体中的顺序一致{2,"李四",21,{77.0,80.0,85.0}}
    };
    
  4. 第四种:定义结构体类型同时定义结构体数组,然后通过索引给结构体成员赋值
     // 定义一个学生类型的结构体
    struct Student
    {int id;char *name;int age;float scores[3];// 三门课程的成绩
    } sts[3];
    sts[0].id = 1;
    sts[0].name = "张三";
    sts[0].age = 12;
    sts[0].scores[0] = 98;
    

小贴士:

结构体数组名访问结构体成员:

格式:结构体数组名 --> 成员名

举例:结构体数组案例_对候选人得票的统计程序。设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出个人得票结果。

 /**
* 结构体数组案例
*/
#include <stdio.h>
#include <string.h>/**
* 定义一个候选人结构体(对象)
*/
struct Person
{char name[20];int count;
};//定义候选人数组,并初始化
struct Person persons[3] =
{{"张月",0},{"李湘",0},{"左碧滢",0}
};void main()
{int i,j;char leader_name[20];//用来接受待投票的候选人姓名//使用一个循环,完成十次投票for(i = 0;i <= 10;i++){printf("请输入您要投票的候选人姓名:\n");scanf("%s",leader_name);//给被投票的候选人+1票for(j = 0;j < 3;j++){//如何判断两个字符串相等if(strcmp(leader_name,persons[j].name) == 0){persons[j].count++;}}}printf("\n投票结果:\n");for(i = 0;i < 3;i++){printf("\n%5s: %d\n",persons[i].name,persons[i].count);}
}

5、结构体指针(即变量指针,非真的结构体指针)

  • 定义:结构体类型的指针变量指向结构体变量或者数组的起始地址。

  • 语法:struct结构体名  *指针变量列表

  • 举例:
    struct Dog
    {char name[20];int age;
    };struct Dog dog;
    struct Dog *p = &dog;
  • 结构体成员访问

  1. 结构体数组名访问结构体成员        1)格式:结构体数组名 -> 成员名;
  2. 结构体成员访问符        1) . :左侧是结构体变量(结构体对象/实例),也可以叫做结构体对象访问成员符;左侧是结构体成员;        2) -> :左侧是一个指针,也可以叫结构体指针访问成员符;右侧是结构体成员。
  • 访问结构体成员有两种类型三种方式

  1. 类型1:通过结构体对象访问成员

     struct Stu
    {int id;char name[20];
    } stu;
    // 访问成员
    stu.name;
  2. 类型2:通过结构体指针访问成员        1)指针引用访问成员;

     struct Stu
    {int id;char name[20];
    } stu;
    struct Stu *p = &stu;
    // 指针引用访问成员
    p -> name;
    

    2)指针解引用间接访问成员;

     struct Stu
    {int id;char name[20];
    } stu;
    struct Stu *p = &stu;
    // 指针解引用间接访问成员
    (*p).name;
    
  • 结构体数组中元素的访问
     struct Stu
    {int id;char name[20];float scores[3];
    } stus[3] = {{1,"张三",{86,88,56}},{2,"李四",{75,66,78}},{3,"王五",{70,99,90}}
    };
    // 取数据 --- 下标法
    printf("%s,%2f\n",stus[1].name,stus[1].scores[2]);// 李四,78
    // 结构体成员引用符号:-> 指针法
    printf("%s,%2f\n",stus -> name,stus -> scores[2]);// 张三,56
    printf("%s,%2f\n",(stus + 1)-> name,(stus + 1)-> scores[2]);// 李四,78
    printf("%s,%2f\n",(*(stus + 1)).name,(*(stus + 1)).scores[2]);// 李四,78
    
  • 小贴士:

结构体是自定义数据类型,它是数据类型,用法类似于基本类型的int;

结构体数组它是存放结构体对象的数组,类似于int数组存放int数据;

基本类型数组怎么用,结构体数组就怎么用--->可以遍历,可以作为形式参数,也 可以做指针等;

举例:结构体类型的使用

#include <stdio.h>
// 定义结构体
struct Cat
{char *name;// 姓名int age;// 年龄char color[20];// 颜色
}
// 1.结构体类型作为形式参数
void test1(struct Cat c);
// 2.结构体类型作为形式参数,结构体类型作为返回值类型
struct Cat test2(struct Cat c);
// 3.结构体数组作为形式参数
void test3(struct Cat cats[],int len);
// 4.结构体数组作为形式参数,结构体指针作为返回值数据类型
struct Cat *test4(struct Cat cats[],int len);int main()
{// 定义结构体对象struct Cat cat = {"小黑",8,"baise"};// 结构体对象作为实际参数test1(cat);// 定义结构体类型对象struct Cat cat1 = {"小白",8,"heise"};// 调用函数并接收返回值struct Cat c1 = test2(cat1);// 通过返回值访问结构体对象的成员printf("%s==%d==%s\n",c1.name,c1.age,c1.color);// 定义结构体数组struct Cat cats[3] = {{"汤姆",16,"蓝色"},{"杰瑞",18,"褐色"},{"唐老鸭",19,"白色"}};// 结构体数组名作为实际参数test3(cats,3);// 定义结构体数组并初始化struct Cat cats1[3] = {{"汤姆",16,"蓝色"},{"杰瑞",18,"褐色"},{"唐老鸭",19,"白色"}};// 调用函数struct Cat *p = test4(cats1,3);struct Cat *w;// 通过指针运算遍历数组for(w = p; w < p + 3; w ++){// p[i][j] = *(p[i]+j) = *(*(p+i)+j) 三者等价// 通过结构体指针访问符访问结构体的成员printf("%s----%d----%s\n",w -> name,w -> age,w -> color);}    }

6、结构体类型求大小(字节对齐)

规则:字节对齐(数据在内存中存储在其类型大小的整数倍上)

1、首先保证结构体中的成员存储在自身的对齐边界(类型大小的整数倍);

2、在满足1的条件下,最终大小要满足最大成员所占存储单元的整数倍。

举例:求结构体数据类型大小

 /**
* 求结构体数据类型的大小
*/
#include <stdio.h>//定义测试结构体
struct test1
{char a;// 1int b;// 4short c;// 2
};int main()
{//创建结构体变量struct test1 tt1;//计算大小printf("%lu\n",sizeof(tt1));//%lu --> 无符号的long类型
}

/**
* 求结构体数据类型的大小
*/
#include <stdio.h>//定义测试结构体
struct test1
{char a;// 1int b;// 4
};struct test1_1
{char a;// 1int b;// 4
}__attribute__((packed));//取消字节对齐,取消之后,结构体数据类型大小就等于其所>有成员的数据类型之和struct test1_2
{char a __attribute__((aligned(2)));// 2 设置对齐的字节数,字节数必须是2的n次
幂int b;// 4
};struct test2
{char a;// 1short c;// 2int b;// 4//short c;// 2
};struct test3
{int num;// 4char name[10];// 10char sex;// 1int age;// 4double score;// 8
};struct test4
{int num;// 4short name[5];// 10char sex;// 1int age;// 4int scores[2];// 8
};int main()
{//创建结构体变量struct test1 tt1;struct test1_1 tt1_1;struct test1_2 tt1_2;struct test2 tt2;struct test3 tt3;struct test4 tt4;//计算大小printf("%lu\n",sizeof(tt1));//%lu --> 无符号的long类型printf("%lu\n",sizeof(tt1_1));printf("%lu\n",sizeof(tt1_2));printf("%lu\n",sizeof(tt2));printf("%lu\n",sizeof(tt3));printf("%lu\n",sizeof(tt4));
}

  • 快速计算结构体大小:

https://blog.csdn.net/weixin_72357342/article/details/131135555 https://blog.csdn.net/x2528238270/article/details/120798606

三、共用体/联合体类型

  • 定义: 使几个不同的变量占用同一段内存的结构。共用体按定义中需要存储空间最大的成员来分配存储单 元,其他成员也是用该空间,他们的首地址是相同。
  • 定义格式:
    union 共用体名称
    {数据类型 变量名;数据类型 变量名;...
    };
  • 共用体的定义和结构体类型相似:

  1. 可以有名字,也可以匿名;
  2. 共用体在定义时也可以定义共用体变量;
  3. 共用体在定义时也可以初始化成员;
  4. 共用体也可以作为形参和返回值类型使用;
  5. 共用体也可以定义共用体数组...

也就是说,结构体的语法,共用体都支持。

  • 注意:

  1. 共用体弊大于利,尽量少用;
  2. 共用体变量在某一时刻只能存一个数据,并且也只能取出一个数;
  3. 公用题和结构体都是自定义数据类型,用法类似于基本数据类型

        1)共用体可以是共用体的成员,也可以是结构体的成员;

        2)结构体可以是共用体的成员,也可以是共用体的成员。

举例:共用体

/*** 共用体*/
#include <stdio.h>// 定义共用体
union S
{char a;float b;int c;
};
// 共用体作为共用体的成员
union F
{char a;union S s;
};
// 共用体作为结构体的成员
struct G
{int a;union S s;
};
// 定义一个结构体
struct H
{int a;char b;
};
// 结构体作为结构体成员
struct I
{int a;int b;struct H h;
};
// 共用体作为结构体成员
struct J
{int a;char b;union S s;
};void test1()
{// 定义共用体类型union Stu{int num;char sex;double score;};// 定义匿名共用体:匿名共用体一般作为结构体成员或者其他共用体成员union{int a;char c;} c;printf("%lu,%lu\n",sizeof(union Stu),sizeof(c));
}
void test2()
{union C{int a;char b;};// 定义变量union C c; // 存数据c.a = 10;c.b = 'A';printf("%d---%d\n",c.a,c.b);// 取数据c.a += 5;printf("%d---%d\n",c.a,c.b);// 取数据union E{char *f;long a;int b;} e = {"hello world!"};printf("%s,%p---%ld,%p---%d\n",e.f,&(e.f),e.a,&(e.a),e.b);
}
int main()
{test1();test2();
}

四、枚举类型

  • 定义:

我们一般情况下,定义常量使用宏定义(#define 宏名称 值),宏定义非常适合没有关联关系的常 量;但是有时候我们可能需要对一组拥有关联关系的量进行定义,比如 周一~周日1月~12月 等, 那么使用宏定义,就不是很清晰在,这个时候就需要使用到枚举。

枚举的存在就是将多个拥有关联关系的常量组合到一起,提高代码的可读性

  • 说明:

枚举类型定义了一组常量,我们在开发中直接使用这些常量。(常用)

当然枚举类型也可以类似于结构体一样定义变量等操作。(不常用)

枚举常量有默认值,从0开始依次加1;我们可以在定义时指定它的值,如果个别没有赋值,可以根 据赋值依次加1推导。

  • 特点:

定义了一组常量,类似于定义了多个自定义常量(宏定义)

提供了代码的可读性(避免了魔术数字)

  • 定义语法:

定义枚举类型名以后就可以定义该枚举类型的变量

enum  枚举类型名  变量表;

在定义枚举类型的同时定义该枚举类型的变量

enum  枚举类型名{ 枚举元素列表 }变量表;

直接定义枚举类型变量

enum { 枚举元素列表 }变量表;

举例:枚举类型

/*** 枚举类型*/
#include <stdio.h>
// 常量-宏定义
// 常量的命名:大写英文字母+下滑下,举例:MAX_VALUE
#define PI 3.1415926
void test1()
{// 定义枚举类型enum Week{SUN=10,MON,TUE,WED,THU,FRI,SAT};printf("%d,%d,%d\n",SUN,WED,SAT);// 定义枚举类型的变量(先定义变量,后赋值)enum Week w;// 初始化w = MON;printf("%d\n",w);// 定义枚举类型的变量同时赋值(定义变量的同时赋值)enum Week w1 = THU;printf("%d\n",w1);enum H{A,B,C  } x,y;x = B;y = C;printf("x=%d,y=%d\n",x,y);// 1,2
}
void test2()
{// 定义枚举enum CaiQuan{SHI_TOU,JIAN_DAO,BU};printf("请输入0~2之间的整数:\n[0-石头,1-剪刀,2-布]\n");int number;scanf("%d",&number);switch(number) // switch和enum是天生的搭档{case SHI_TOU:printf("石头\n");break;case JIAN_DAO:printf("剪刀\n");break;case BU:printf("布\n");break;}
}
int main()
{test1();test2();
}

五、typedef(类型重命名)

  • 说明:给类型重命名,不会影响到类型本身
  • 作用:给已有的类型起别名
  • 格式:
    typedef 已有类型名 新别名;
  • 使用:
    //定义结构体
    struct Student
    {int a;char *name;char sex;int age;
    };//类型重命名
    typedef struct Student Stu;//定义变量
    struct Stu stu = {1,"张甜",'M',23};//定义结构体的同时重命名
    typedef struct PersonInfo
    {int a;double b;
    }Per;//定义变量
    struct Per per = {2,5};
  • 应用场景
  1. 数据类型复杂(结构体,共用体,枚举,结构体指针)时使用
  2. 为了跨平台兼容性,例如:1)size_t :类型重命名后的数据类型, typedef unsigned long size_t;    2)unit_16 :类型重命名后数据类型

举例:类型重命名

//类型重命名
#include <stdio.h>
struct Student
{int age;char* name;double score;int arr[3];
};
typedef struct Student   Stu_t;
typedef Stu_t* pStu_t;
void test1()
{Stu_t s1 = {23, "zhangsan", 23.33, {11, 22, 33}};printf("%d, %s, %f, %d\n", s1.age, s1.name, s1.score, s1.arr[0]);//Stu_t *p = &s1;Stu_t*  p;p = &s1;pStu_t p2;p2 = p;printf("%d, %s, %f, %d\n", p2->age, p2->name, p2->score, p2->arr[0]);}
int main()
{test1();return 0;
}

六、作业

1. 设计一个结构体,存放一个学员信息并显示,存放两个学员信息,算他们的平均分。

 代码:

 /**
* 设计一个结构体,存放一个学员信息并显示,存放两个学员信息,算他们的平均分
*/
#include <stdio.h>
#include <string.h>//全局的结构体(数据类型)
struct Student
{char name[20];//姓名int age;//年龄char sex;//性别  M:男  W:女float score;//分数
}stu;//先定义再初始化
void one_stu()
{
//    typedef Student stu;printf("\n请输入学员信息:姓名,年龄,性别(M:男;W:女)\n");printf("请输入学员姓名:\n");scanf("%s",stu.name);printf("请输入学员%s的年龄,性别:\n",stu.name);scanf("%d,%c",&stu.age,&stu.sex);printf("姓名:%s,年龄:%d,性别:%c\n",stu.name,stu.age,stu.sex);
}void multi_stu()
{int i = 0,n;float sum = 0.0;printf("请选择要输入几名学员的信息___:%d\n",n);scanf("%d",&n);//    Student stu[n];//    for(i = 0;i < n;i++)do{printf("\n请输入学员信息:姓名,年龄,性别(M:男;W:女),成绩:\n");printf("请输入学员姓名:\n");scanf("%s",stu.name);printf("请输入学员%s的年龄,性别,分数:\n",stu.name);scanf("%d,%c,%f",&stu.age,&stu.sex,&stu.score);printf("姓名:%s,年龄:%d,性别:%c,分数:%.2f\n",stu.name,stu.age,stu.sex,stu.score);i++;//    sum += stu[i].score;
//    float aver = sum / (n-1);//    return aver;}while(i <= (n-1));int main()
{
//    stu s[2];int l,n;printf("请选择输入几个学员的信息(一个(0),多个(1))___:%d\n",l);scanf("%d",&l);switch(l){case 0:one_stu();break;case 1:
//            stu s[2];
//        default:multi_stu();
//            float aver = calcuAver(s,count);
//            printf("平均分为:%.2f\n",aver);break;default:printf("程序错误!\n");}
//    one_stu();
//    multi_stu();return 0;
}

运行效果:

2. 设计一个描述商品的结构体,存放一个商品信息,并显示。

 代码:

 /**
* 设计一个描述商品的结构体,存放一个商品信息,并显示
*/
#include <stdio.h>
#include <string.h>struct Information
{char name[20];//名称int number;//数量double price;//价格
}info;void entering()
{printf("请输入商品信息:___\n");printf("请输入商品名称:\n");scanf("%s",info.name);printf("请输入商品数量:\n");scanf("%d",&info.number);printf("请输入商品价格:\n");scanf("%lf",&info.price);printf("您已录入商品%s的数量%d价格%5.2lf\n",info.name,info.number,info.price);
}int main()
{entering();return 0;
}

运行效果:

3. 作业2的基础之上完成以下功能:

(1)存储多个商品的信息,后显示

(2)查询价格最高的商品的信息

(3)用静态分配(结构体变量)和动态分配分别实现。

 代码:

 

运行效果:

4. 开发一个简易的成绩管理系统: 存储多个学员信息并处理 要求如下:

(1)申请多个空间,存入学员信息

(2)求分数最高学员姓名

(3)求总分和平均分

(4)统计查询 查询平均分以上学员的姓名

(5)按照成绩排序

 代码:

 

运行效果:

5. 确认电脑的主机字节序。大端(高字节的数据存放在低地址上,低字节的数据存放在高地址上), 小端(高字节的数据存放在高地址上,低字节的数据存放在低地址上)

代码:

 

运行效果:

f图像 小部件

相关文章:

C语言基础⑩——构造类型(结构体)

一、数据类型分类 1、基本类型 整数型 短整型&#xff1a;short&#xff08;2个字节&#xff09;&#xff1b;整型&#xff08;默认&#xff09;&#xff1a;int&#xff08;4个字节&#xff09;&#xff1b;长整型&#xff1a;long&#xff08;8个字节&#xff09;&#xf…...

宝兰德荣获openEuler项目群青铜捐赠人称号,共筑开源生态繁荣新篇章

近日&#xff0c;开放原子开源基金会正式公布了新增捐赠人名单&#xff0c;宝兰德凭借在开源领域的卓越贡献与深厚实力&#xff0c;被授予openEuler项目群青铜捐赠人称号。 开放原子开源基金会是致力于推动全球开源事业发展的非营利机构&#xff0c;于2020年6月在北京成立。开放…...

【Python单元测试】学习笔记3

文章目录 08.PyTest框架什么是PyTestPyTest的优点PyTest的测试环境PyTest常用参数跳过测试 09.PyTest fixture基础PyTest fixture定义和使用引用多个Fixture 10. conftest.pyconftest.py的用途 11. 参数化测试用例为什么需要参数化测试用例使用parameterizer插件实现使用pytest…...

OpenSSL源码编译及Debug

** 1. 环境 Linux 5.19.0-14-generic 22.04.1-Ubuntu 2. 所需工具 gcc version 11.3.0 (Ubuntu 11.3.0-1ubuntu1~22.04) cmake version 3.22.1 3. 步骤 3.1 获取openssl源码 方法可以git clone获得源码&#xff0c;或者直接去GitHub上下载压缩包&#xff0c;GitHub网址&#xf…...

go之goburrow/modbus 学习

goburrow/modbus 是一个用Go语言实现的Modbus协议库&#xff0c;提供了Modbus主机&#xff08;Master&#xff09;和从机&#xff08;Slave&#xff09;的实现&#xff0c;支持两种主要的Modbus传输模式&#xff1a;Modbus TCP和Modbus RTU。 功能介绍 1. 支持的传输模式 Mod…...

开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)算法是什么?

开放词汇目标检测&#xff08;Open-Vocabulary Object Detection, OVOD&#xff09;算法是什么&#xff1f; 随着计算机视觉技术的快速发展&#xff0c;目标检测&#xff08;Object Detection&#xff09;已经在各种应用场景中得到了广泛的应用。然而&#xff0c;传统的目标检…...

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm&#xff0c;其他软件也是一样操作 1、进入到pycharm的目录&#xff0c;先通过命令行打开pycharm&#xff1a; ./bin/pycharm…...

三个月外贸小白好迷茫,该何去何从?

最近看到一个共性的问题&#xff0c;也许对于大多数外贸新人来说&#xff0c;都有过这样的困扰和无力感&#xff0c;也许对于每一个没有强大背景的外贸小伙伴来说&#xff0c;可能都是这样一路成长起来的。 大家好&#xff0c;我是一名普通二本英专生&#xff0c;八月中旬入职…...

MySQL数据库——基本查询(Create)

CRUD&#xff1a;Create&#xff08;创建&#xff09;Retrieve&#xff08;读取&#xff09;Update&#xff08;更新&#xff09;Delete&#xff08;删除&#xff09; 1.Create ①单行数据全列插入 insert [into] table_name [(colume[,colume]……)] values (value_list) […...

spring-security-1-快速入门

1 功能 身份认证(authentication)授权(authorization)防御常见攻击 身份认证&#xff1a;常见账号密码登录&#xff0c;短信登录 授权&#xff1a;什么样的角色&#xff0c;能看见什么菜单&#xff0c;能访问哪些接口。 2 pom <dependency><groupId>org.springf…...

5 大场景上手通义灵码企业知识库 RAG

大家好&#xff0c;我是通义灵码&#xff0c;你的智能编程助手&#xff01;最近我又升级啦&#xff0c;智能问答功能全面升级至 Qwen2&#xff0c;新版本在各个方面的性能和准确性都得到了显著提升。此外&#xff0c;行间代码补全效果也全面优化&#xff0c;多种编程语言生成性…...

免费远程控制电脑的软件有哪些?

什么是远程控制&#xff1f; 远程控制是一种通过网络从一台设备操作另一台设备的技术。连接后&#xff0c;用户可以直接远程操作那台电脑进行各种操作。随着科技的不断进步和用户需求的增加&#xff0c;远程控制市场日益蓬勃。远程控制不仅应用于远程办公和远程教学&#xff0…...

Linux软件包yum

目录 Linux软件包管理器 yum关于rzsz注意事项查看软件包如何安装软件卸载命令 Linux开发工具Linux编辑器-vim使用1. vim的基本概念2. vim的基本操作3. vim正常模式命令集4. vim末行模式命令集5. vim操作总结 小彩蛋 Linux软件包管理器 yum 软件包 在Linux下安装软件&#xff…...

网页的切换与嵌套

网页的切换与嵌套 网页的切换 在浏览器窗口中如果点击超链接标签会在当前的浏览器窗口中显示新的数据&#xff0c;但有些超链接标签点击后却会在一个新的窗口显示数据&#xff0c;这种情况下就无法对新的开的窗口页面进行操作了。 基于这种情况&#xff0c;我们就需要使用dri…...

基于飞桨框架的稀疏计算使用指南

本文作者-是 Yu 欸&#xff0c;华科在读博士生&#xff0c;定期记录并分享所学知识&#xff0c;博客关注者5w。本文将详细介绍如何在 PaddlePaddle 中利用稀疏计算应用稀疏 ResNet&#xff0c;涵盖稀疏数据格式的础知识、如何创建和操作稀疏张量&#xff0c;以及如何开发和训练…...

启明云端WT32C3-S6物联网模块,乐鑫ESP32-C3芯片技术应用

随着物联网技术的飞速发展&#xff0c;智能设备在我们生活中的应用越来越广泛。从智能电网到远程医疗&#xff0c;从楼宇自动化到智能家居&#xff0c;这些技术正在改变我们的生活方式。 在这样的背景下&#xff0c;启明云端推出的WT32C3-S6 WiFi模块以其低功耗、高性价比的特…...

超越流水线,企业研发规范落地新思路

作者&#xff1a;子丑 内容大纲&#xff1a; 1、研发规范≠流程约束 2、自动化工具→研发规范载体 3、研发规范在工具上的落地示例 4、研发规范的选型方法与常见实践 研发规范≠流程约束 这个故事特别适合研发规范的场景&#xff0c;我们要避免成为把猫绑在柱子上的信众…...

财务会计与管理会计(四)

文章目录 月度数据统计分析OFFSET函数在图表分析中的应用 多种费用组合分析图SUMPRODUCT函数 省公司全年数据分析模板INDIRECT、OFFSET函数 多公司分季度数据筛选VLOOKUP、IFERROR函数的应用 淘宝后台数据分析OFFSET函数在跨表取数中的应用 燃气消耗台账数据统计分析图SUMPRODU…...

回归分析系列1-多元线性回归

03 多元线性回归 3.1 简介 多元线性回归是简单线性回归的扩展&#xff0c;允许我们同时研究多个自变量对因变量的影响。多元回归模型可以表示为&#xff1a; 其中&#xff0c;x1,x2,…,xp是 p 个自变量&#xff0c;β0 是截距&#xff0c;β1,β2,…,βp是对应的回归系数&…...

web小游戏开发:拼图——蜂巢拼图

web小游戏开发:拼图——蜂巢拼图 蜂巢拼图游戏规则调整选项切图计算六边形的宽和高铺上背景画出蜂巢制作图块游戏方法打乱排列拖拽图块开始拖拽拖拽移动放置图块小结蜂巢拼图 之前我们已经完成了长方形的拼图代码,包括了三个游戏方式,并讨论了带咬合齿的游戏代码该如何制作…...

springCloud集成activiti5.22.0流程引擎(分支)

springCloud集成activiti5.22.0流程引擎 点关注不迷路&#xff0c;欢迎再访&#xff01; 精简博客内容&#xff0c;尽量已行业术语来分享。 努力做到对每一位认可自己的读者负责。 帮助别人的同时更是丰富自己的良机。 文章目录 springCloud集成activiti5.22.0流程引擎一.Sprin…...

ppt模板免费网站有哪些?自动美化工具推荐

新的8月&#xff0c;是时候以全新面貌迎接高效办公挑战了&#xff01; 想要你的PPT演示脱颖而出&#xff0c;却苦于找不到精美又免费的模板&#xff1f; 别担心&#xff0c;今天我来告诉你们&#xff1a;哪个软件有精美免费ppt模板&#xff1f; 今天我为你们精心汇总了6款PPT…...

java实现解析pdf格式发票

为了减少用户工作量及误操作的可能性&#xff0c;需要实现用户上传PDF格式的发票&#xff0c;系统通过解析PDF文件获取发票内容&#xff0c;并直接将其写入表单。以下文章记录了功能实现的代码。 发票样式 发票内容解析 引用Maven 使用pdfbox <dependency><groupI…...

数据结构初阶——算法复杂度超详解

文章目录 1. 数据结构前言1. 1 数据结构1. 2 算法 2. 算法效率2. 1 复杂度的概念 3. 时间复杂度3. 1 大O的渐进表示法3. 2 时间复杂度计算示例3. 2. 1 示例13. 2. 2 示例23. 2. 3 示例33. 2. 4 示例43. 2. 5 示例53. 2. 6 示例63. 2. 7 示例7 4. 空间复杂度4. 1 空间复杂度计算…...

ArcGIS Pro SDK (十二)布局 4 预定义的形状和箭头

ArcGIS Pro SDK (十二)布局 4 预定义的形状和箭头 文章目录 ArcGIS Pro SDK (十二)布局 4 预定义的形状和箭头1 创建预定义的形状图形元素2 创建预定义的形状图形元素3 创建预定义的形状图形元素4 创建线箭头元素环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0 1 …...

在 Ubuntu 14.04 服务器上安装 ISPConfig3 的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 虽然命令行是一个强大的工具&#xff0c;可以让您在许多情况下快速轻松地工作&#xff0c;但在某些情况下&#xff0c;可视化界面…...

ELK学习笔记

ElasticStack分布式日志系统概述 Elasticsearch: 一个分布式搜索引擎&#xff0c;能够快速存储、搜索和分析大量数据。核心概念包括索引&#xff08;Index&#xff09;、文档&#xff08;Document&#xff09;和分片&#xff08;Shard&#xff09;。使用 RESTful API 进行数据操…...

Python+Selenium+Pytest+POM自动化测试框架封装详解

1、测试框架简介 1&#xff09;测试框架的优点 代码复用率高&#xff0c;如果不使用框架的话&#xff0c;代码会显得很冗余。可以组装日志、报告、邮件等一些高级功能。提高元素等数据的可维护性&#xff0c;元素发生变化时&#xff0c;只需要更新一下配置文件。使用更灵活的…...

Hidden Marlov Model(HMM)

一、Model 1、将声学特征设为X&#xff0c;经过语音识别得到的tokens设为Y&#xff0c;目标是找到通过X得到Y的最大概率&#xff0c;可以通过概率公式改变为 分为两个概率 2、将tokens序列Y转化为states序列S&#xff0c;声学特征分得更细 3、从states到声学特征的过程 二、HM…...

mamba的安装及下载速度慢问题解决

同事反馈mamba的安装时网络慢 mamba是conda的加速工具&#xff0c;相比于conda 对包和环境的管理&#xff0c;mamba可以实现并行运算。相比于 conda&#xff0c;mamba 是用C重写了 conda 的部分功能&#xff0c;运行效率显著提高&#xff0c;可以进行并行的下载&#xff0c;使…...

wordpress默认链接/淘大象关键词排名查询

Hive支持的数据类型如下&#xff1a; 原生类型: TINYINTSMALLINTINTBIGINTBOOLEANFLOATDOUBLESTRINGBINARY (Hive 0.8.0以上才可用)TIMESTAMP (Hive 0.8.0以上才可用) 复合类型: arrays: ARRAY<data_type>maps: MAP<primitive_type, data_type>structs: STRUCT…...

怀柔石家庄网站建设/刷网站seo排名软件

官方文档&#xff1a;秋云uCharts图表组件 1、导入到对应项目中 根目录会多出文件夹uni_modules 柱状图基础使用 完整代码&#xff1a; <template><view><view class"charts-box"><qiun-data-charts type"column" :chartData&quo…...

做图文链接网站/一个新手如何推销产品

Windows 10系统是微软独立发布的最后一个Windows版本&#xff0c;下一代Windows都将作为更新形式出现&#xff0c;因此&#xff0c;WIN10都会开启自动更新&#xff0c;当我们使用电脑WIN10的时候&#xff0c;老是提示我们需要更新系统&#xff0c;很烦人&#xff0c;那么怎么关…...

网站开发人员的 生活/如何进行网络推广营销

实现方法&#xff1a;(需要开启悬浮窗通知权限、允许应用在其他应用上显示)一.利用headsup悬挂式Notification&#xff0c;他是5.0中新增的&#xff0c;也就是API中的Headsup的Notification&#xff0c;可以在不打断用户操作的时候&#xff0c;给用户通知二.使用Window创建悬浮…...

wordpress文章 页面模板/东莞有限公司seo

今年6月是全国第19个“安全生产月”&#xff0c;连日来&#xff0c;全省消防救援部门紧紧围绕“消除事故隐患&#xff0c;筑牢安全防线”这一主题&#xff0c;开展了一系列助力平安活动&#xff0c;进一步普及消防安全知识&#xff0c;有效提高广大群众面对突发事故的自救和应急…...

网站icp备案证书/重庆百度快照优化

偶然看到了华为高薪招聘八位博士的新闻&#xff0c;我比较感兴趣&#xff0c;于是找来他们的专业方向&#xff0c;想看看华为到底在哪些领域上下血本了。 自动学习机器视觉导航软件无线电建模语言设计与软件形式化方法功耗控制大数据计算数学一人未知同时这八位博士研究方向各不…...