游戏筑基开发之结构体(数组、指针)、枚举、共用体、typdef(C语言)

1.结构体类型

  在C语言中,结构体是一种复合数据类型,也就是,一个数据类型中包含多种数据类型(包括复合数据类型)。其字节大小为所有成员函数所占大小之和。

结构体声明:
struct [结构体名]
{
数据类型 变量名;

数据类型 变量名N;
}[变量名][, 变量名 = {值1,…,值N}];

//标准定义结构体
struct tagStu
{
    char name[1024];
    int num;
}stu1, stu2 = { "张三",20 };

// 匿名结构体
struct
{
    char name[1024];
    int num;
}stu11, stu22 = { "张三",20 };

//结构体作为另一结构体的数据成员
struct tagScore
{
    float n1;
    float n2;
    float n3;
};

struct tagStu1
{
    char name[1024];
    int num;
    struct tagScore socre;
};

结构体变量的定义:
struct 结构体名 变量名 [={初始值}];

struct tagStu1 stu33 = { "李四",200,{100,200,300} };
struct tagStu1 stu44;
stu44 = stu33;//底层是memcpy(&stu44,&stu33,sizeof(struct tagStu1));

memcpy(&stu44,&stu33,sizeof(struct tagStu1));//无条件将stu33 的内存数据拷贝值stu44中,最后一个参数是复制的字节长度。

//C语言底层具体实现大致如下:
void memcpy(void* dest, void* src, int size)
{
	for (int i = 0; i < size; ++i)
	*(((unsigned char*)dest) + i) = *(((unsigned char*)src) + i);
}

访问结构体:
结构体变量名.成员变量名;

	//匿名结构体访问方式
    printf("%s,%d\n", stu22.name, stu22.num);

	//标准结构体的访问方式
	printf("%s,%d\n", stu33.name, stu33.num);
    printf("%f,%f,%f\n", stu33.socre.n1, stu33.socre.n2, stu33.socre.n3);

2.结构体数组

数组中每个元素都是结构体,结构体数组是用来表示相同用数据类型的集合。

结构体数组的定义:
struct 结构体名 变量名[数组长度] [={初始值}];

struct tagStu1 stus[10] = { { "李四",200,{100,200,300} },{ "王五",200,{100,200,300} } };

访问方式:
数组名[下标].成员变量 = 值;

stus[0].name
stus[0].num = 700;

3.枚举类型

  枚举类型在开发中使用的较多,常用它来代替,宏常量。
  用途:增强代码可读性、标记当前物体等。
  枚举是一个整数类型,只占4个字节。

枚举的声明:
enum [枚举名称]
{
  枚举值名称 [=值],
  枚举值名称 [=值],
  枚举值名称 [=值],
};
TIPS:枚举值名称的值不能重复,并且如果在忽略的情况下自动+1。

enum EType
{
    E_Wall = 100,
    E_Food,
    E_None,
};

枚举的访问:
enum 枚举名称 变量名 = 值;

	enum EType e = E_Wall;
	int a = sizeof(enum EType);//4

	switch (e)
    {
    case E_Wall:
        break;
    case E_Food:
        break;
    case E_None:
        break;
    default:
        break;
    }

4.共用体

  顾名思义,它是共享类型的,如果说,结构体类型是每个成员变量有单独的内存,而共用体类型则是使用相同的内存,注意以最大的单位申请内存,也就是说,不管你使用几字节内存,全部按最大的内存申请。

	union Union
    {
        unsigned char arr[4];
        int num;
    };

    union Union u;
    u.num = 0xff00ff;
    printf("%d %d %d", u.arr[0], u.arr[1], u.arr[2]);

	int b = sizeof(union U);

5.结构体指针

  结构体指针和普通指针类似,只不过,在访问成员变量的方式上有一些小区别。
  结构体指针本质上是指针。

结构体指针的声明:
struct 结构体名称* 变量名;

	struct tagStu* p = NULL;
    p = malloc(sizeof(struct tagStu));

结构体指针的使用:
变量名->成员变量; / (*变量名).成员变量;

	p->num = 200;
	free(p);//释放指针
    p = NULL;//置为空

TIPS:
野指针:指向无效的内存空间;
空指针: 指向NULL;

6.typedef 别名

  用途:统一C和C++编码问题。

别名的声明:
typedef 原数据类型 别名名称;

	typedef struct tagStu TStu;

	TStu s1;
    s1.num = 200;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ufgnix0802

总结不易,谢谢大家的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值