C语言复习:(七)结构体规则

问题:

1.typedef的意义?struct后紧跟着的名称的意义?struct括号末尾后名称的意义?

2.如何在结构体内调用自己?

3.如何在别的结构体中调用已经定义了的结构体?在结构体中定义结构体数组,申请内存应当如何申请内存?

4.在别的文件中定义的结构体是否能被另外文件中的结构体调用?

问题解决:

1.typedef的调用方式为:

typedef Name1 Name2;

Name1 与 Name2 具有相同的意义;

Name1* object = (Name1*)(malloc(sizeof(Name1)));
Name2* object = (Name2*)(malloc(sizeof(Name2)));

上述两者意义相同;

所以:

typedef struct Name1
{
    int A;
    long Timer;
}Name2;
Name1* object = (Name1*)(malloc(sizeof(Name1)));
Name2* object = (Name2*)(malloc(sizeof(Name2)));

 上述是将struct Name1 替换为了Name2;

所以下面赋值依然合法;

所以:struct后紧跟着的名称的意义与struct括号末尾后名称的意义相同。

2.malloc函数是返回(void*)类型的内存给指针。只能分配内存给指针而不能给常量。

所以如果想要自己调用自己,就只能定义自己的指针。(比如链表)

struct Name1
{
	int Data;
	static int A;
	Name1* object;    //    自己调用自己
};

 3.malloc只能分配内存给隶属于此结构体的结构。

typedef struct Role_Struct
{
    int Map_x,Map_y;
    struct
    {
        int x,y;
        int w,h;
    }CollisionBody;
}Role_Struct;

上述的结构体的结构全是隶属于此结构体结构,malloc能直接分配内存给对象。

typedef struct MonsterAttackRole_Struct
{
    int SkillNum;
    int SkillHurm;
}MonsterAttackRole_Struct;


typedef struct Role_Struct
{
    int Map_x,Map_y;

    MonsterAttackRole_Struct* RoleAttackedByMonster[100];    
}Role_Struct;

 上述中,在另一个类中出现另一个结构体变量,另一个结构体变量不属于此结构体,malloc函数无法为其对象分配内存,需要单独进行分配。

Role_Struct* Role_object = (Role_Struct*)(malloc(sizeof(Role_Struct)));
//首先为第一个对象分配内存

for(int Num = 0;Num <= 100 - 1; Num++)
{
    Role_object->RoleAttackedByMonster[Num] = (MonsterAttackRole_Struct*)
        malloc(sizeof(MonsterAttackRole_Struct));
}
//为人物对象中的每一个其他类对象分配内存

 应该采用上述操作进行内存分配。

4.在别的文件中定义的结构体只能被另外的.cpp文件中的结构体调用,而不能被其他的.h文件调用。

struct Exp_Struct
{
	int A;
	long B;
};

//-------------------Exp1.h---------------------


typedef struct Exp2_Struct
{
	int A;
	long B;
	Exp_Struct* Exp2_object;
}Exp2_Struct;

//-------------------Exp2.h---------------------

上述写法为错误写法:

原因:编译器总是先编译.h文件再去编译.cpp文件

在一起编译.h文件的时候Exp2.h中会发生Exp_Struct未定义的情况

struct Exp_Struct
{
	int A;
	long B;
};

//-------------------Exp1.h---------------------


typedef struct Exp2_Struct
{
	int A;
	long B;
	Exp_Struct* Exp2_object;
}Exp2_Struct;

//-------------------Exp2.cpp---------------------

上述写法正确:

因为.h文件全部编译完成之后,再去编译.cpp文件就不会出错

综上:结构体能跨文件在别的.cpp中定义调用。

解决办法:

struct Exp2_Struct;
//在使用之前提前声明就不会出问题。

struct Exp_Struct
{
	int A;
	long B;
    Exp2_Struct* Exp2_object;
};

//-------------------Exp1.h---------------------

struct Exp_Struct;
//在使用之前提前声明就不会出问题。

typedef struct Exp2_Struct
{
	int A;
	long B;
	Exp_Struct* Exp2_object;
}Exp2_Struct;

//-------------------Exp2.h---------------------

如上图:只要在对应的文件中提前声明要使用的结构体,就能相互调用。A中调用B,B中调用A,形成环链表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值