练习题一
1、定义一个结构体Monster,能够存储怪的各种信息(至少有一个成员是结构体类型)。
2、声明一个Monster类型的数组,长度为10.
3、编写一个函数,为第二题中的数组赋值.
4、编写一个函数,能够通过怪物ID,打印当前这个怪物的所有信息.
// hele.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//定义一个坐标结构体
struct coordinate
{
float x;
float y;
float h;
};
//定义一个游戏怪物结构体,使用上面的坐标结构体
struct Monster
{
int id;
int Life_value;
int Magic_value;
int Grade;
int Aggressivity;
coordinate position;
};
//声明一个Monster的结构体数组tianlong长度为10
Monster tianlong[10]; //声明一个结构体变量时要放在定义结构体的后面调用了这个结构体的函数前面。
//通过循环给结构体全部赋值
void Function()
{
int i;
for(i=0; i<10; i++)
{
tianlong[i].id = i+1;
tianlong[i].Life_value = 100+i;
tianlong[i].Magic_value = 200+i;
tianlong[i].Grade = 10+i;
tianlong[i].Aggressivity = 300+i;
tianlong[i].position.x = 20.0;
tianlong[i].position.y = 30.0;
tianlong[i].position.h = 40.0;
}
}
//通过循环判断结构体的里的ID是否等于我们要寻找的如果是就输出ID为X的怪物信息
void Fubction1(int x)
{
int i = 0;
while(i<10)
{
if(x == tianlong[i].id)
{
printf("当前怪物ID%d生命%d魔法%d等级%d攻击力%d坐标x:%fy:%fh:%f",tianlong[i].id,tianlong[i].Life_value,tianlong[i].Magic_value,
tianlong[i].Grade,tianlong[i].Aggressivity,tianlong[i].position.x,tianlong[i].position.y,tianlong[i].position.h);
break;
}
i++;
}
}
int main(int argc, char* argv[])
{
Function();
Fubction1(5);
return 0;
}
声明一个结构体变量时要放在定义结构体的后面调用了这个结构体的函数前面。
练习二分析下面结构体的内存分配
struct S1
{
char c; 8
double i; 8
};
默认对其参数8的情况下是16
struct S2
{
char c1; 8
S1 s; 16
char c2; 8
char c3;
};
默认对其参数8的情况下是32
struct S3
{
int c1; 4
char c2[10]; 10+2=12
};
默认对其参数8的情况下是16
在进行参数对其时以参数小的为值
最后在以最大的参数对小于其参数值的进行补齐
所以按照数据类型由小到大的顺序进行书写可以节省空间。
可以通过#pragma pack(n)修改默认的对其参数只能时1,4,8
递归函数反汇编分析
在汇编中递归就是一直执行某段代码段和循环很像,和循环不同的是递归会对堆栈进行操作而循环不会。