结构体


结构体:构造数据类型
概念:由一类具有相同类型或不同的数据类型构成的数据集合
结构体的定义
结构体变量的初始化
结构体变变量的引用
结构体变量指针
结构体变量数组
结构体变量传参

结构体的定义

结构体的定义:
一般格式:
<存储类型> struct 结构体名称
{
数据类型 成员变量1;
数据类型 成员变量2;
数据类型 成员变量3;

数据类型 成员变量n;
};

struct stu
{
    char    name[32];
    int     id;
    char    sex;
    float   score;
};

结构体定义完成之后,意味着会出现一个新的数据类型
struct stu;
这个数据类型和基本的数据类型可以通用;
int a ;
struct stu b;
结构体使用之前必须有类型的定义,在定义变量;
结构体的特殊定义
1、无名结构体(定义结构体时定义变量)

struct 
{
    int id;
    char name[32];
}a; //a是变量,且申请空间

1.1 struct没有结构体名称
1.2 }和;之间必须要有变量的定义,多个变量用,隔开
1.3 其他结构体部分同标准格式结构体定义
2 、嵌套定义

#include <stdio.h>
int main(int argc,const char* argv[])
{
    struct
    {   
        int class;
        char grade[32];
        struct
        {
            int id; 
            char name[32];
        }stud;

    }a,b;
    return 0;
}

注意:无名结构体嵌套定义之后一定要跟变量
3、结构体重定义

struct stu
{
    char    name[32];
    int     id;
    char    sex;
    float   score;
};
         struct stu a;
         struct stu b;
       ⇒  转换
typedef struct stu
{
    char    name[32];
    int     id;
    char    sex;
    float   score;
}STU;  //有typedef的时候,则STU是类型名称
       STU a;
       STU b;

结构体的初始化

typedef struct stu
{    
    int     id;
    char    name[32];
    float   score;
}STU;  //有typedef的时候,则STU是类型名称

简单初始化:
STU a = {1,“zhangsan”,99.5};
不初始化
STU b;
部分初始化:
STU c = {100};
STU c = {10,"",8.8};
全部初始化 ==》 简单初始化
默认初始化:
STU d = {0};
嵌套初始化

struct
{   
    int class;
    char grade[32];
    struct
    {   
        int id; 
        char name[32];
    }stud;
}a={14,"2017",{1,"zhangsan"}};

结构体的引用:
直接引用:"."
a.id
a.name
a.score
间接引用:"->" //间接应用的左值必须是指针
STU stu = {0};
STU *p = &stu;
p->id;
p->name;
p->score;

结构体的指针和数组

结构体的指针:
1、结构体本身的指针
strcut student stu,*pstu;
int a,*pa;
以上的变量都是随机值,指针是野指针
struct student stu ={0};
struct student *pstu = &stu;
⇒ struct student stu ={0},*pstu = &stu;
在访问成员变量过程中:
pstu->xxx;
pstu->yyy;
2、结构体成员变量是指针
struct person
{
char name[32];
long long id;
} ;
struct student
{
int id;
char *name;
};
3、嵌套结构体指针
typedef strcut student
{
int id;
char *name;
}STU;
typedef struct preson
{
long long id;
STU *p;
STU stu;
}PER;
PER per;
STU std;
per.id = 610121200010102345;
per.p = &std;
4、结构体数组
int a[10];
struct student
{
int id;
char name[32];
} ;
typedef strcut student STU;
STU stu[10]; //结构体数组
STU *pstu = &stu[0]; //结构体指针数组

结构体的应用

结构体的应用
1、结构体传参
int add(int a,char b,int c,int *d);
使用结构体传参:
typedef struct
{
int a;
char b;
int c;
int *d;
}NUM;
int add(NUM n);
2、结构体返回值:
int add(int a ,int b);
char *add(int a,int b);
struct NUM add(inta,int b);

结构体的特点

结构体中有多种数据类型要按4字节对齐
1、字节对齐原则
1.1 结构体或联合体总是以第一个数据成员为其实地址,开始默认4字节对齐
1.2 如果结构体中有大数据类型成员,会按照大类型的数据长度最近进4的整倍数对齐
1.3 结构体成员的大小必须是最大成员的整倍数
2、字节对齐开关
#pragma pack(1) //括号内1为1字节对齐

联合体

联合体(共用体):union
定义格式:
union 联合体名称
{
数据类型 成员变量名1;
数据类型 成员变量名2;

数据类型 成员变量名3;
};
共用体的每一个成员公用同一块资源;
共用体/联合体:
1、占用的内存长度为其最长的内存长度。
2、不能对共用体变量进行初始化
3、共用体变量不能作为函数的参数或返回值,但是可以使用指向共用体变量的指针
4、成员的引用与结构一样, . ->
5、共用体变量的实现采用覆盖技术
6、共用体所有成员的地址与共用体变量的地址相同
&m = &m.a = &m.b = &m.c = &m.d
大端存储:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中
小端存储:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中

枚举

枚举 ==》 enum

一般格式:
enum 枚举名
{
枚举值表, //单词
};
eg:enum weekday
{
sun, //0
mon, //1
tue, //2
wed, //3
thu, //4
fir, //5
sat, //6
} ;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值