参考裸编程思想。

#include <stdio.h>
//#include "ycjobject.h" // 颜色定义
#define CL_BLACK 0
#define CL_WHITE 1
#define CL_GRAY 2 // 物种身份ID定义
#define ID_GRASS 0x0001
#define ID_CARROT 0x0002
#define ID_GREENVEGETABLE 0x0004
#define ID_RABBIT 0x0010
#define ID_FISH 0x0020
#define ID_WOLF 0x0100 // 空指针定义
#define NIL 0 // 函数指针类型定义
typedef char (*teat)(unsigned food);
typedef void (*trun)(void);
typedef unsigned (*species)(void); // 兔子类
struct TRabbit
{
species id; // 类的类型标识
species food; // 食物常量
species enemy; // 敌人常量 unsigned char color; // 颜色变量
float weight; // 重量变量,以千克为单位
unsigned char age; // 年龄变量,以月为单位 teat Eat; // 吃行为
trun Run; // 跑行为
}; // ===== implement =====
// 功能:返回兔子的类型
// 参数:无
// 返回:兔子的类型
// 备注:
unsigned rabbitId(void)
{
return ID_RABBIT;
} // 功能:返回兔子的食物
// 参数:无
// 返回:兔子的食物
// 备注:多种食物一次返回
unsigned rabbitFood(void)
{
return ID_GRASS|ID_CARROT|ID_GREENVEGETABLE;
} // 功能:返回兔子的敌人
// 参数:无
// 返回:兔子的敌人
// 备注:多种敌人一次返回
unsigned rabbitEnemy(void)
{
return ID_WOLF;
} // 功能:兔子吃
// 参数:food,unsigned类型,喂给兔子的食物
// 返回:0:没吃成
// 1:吃成了
// 备注:
char rabbitEat(unsigned food)
{
// 都说兔子不吃窝边草
// 那么不是窝边的草就可以吃
// 它兔窝边的草不是我窝边的草,所以也可以吃
// 还有,萝卜和青菜,也可以吃
// 兔子不能吃兔子,不能吃鱼,更不能吃狼
return (food & 0x0007);
} // 功能:兔子跑
// 参数:无
// 返回:无
// 备注:
void rabbitRun(void)
{
// 可以蹦
// 可以跳
// 可以跑
} // 功能:兔子类创建
// 参数:aRabbit,TRabbit类型,一只兔子
// 返回:无
// 备注:
void rabbitCreate(struct TRabbit *obj)
{
// 常量初始化
obj->id = rabbitId;
obj->food = rabbitFood;
obj->enemy = rabbitEnemy; // 变量初始化
// 因为变量初始化没有意义,所以不做 // 行为(方法)初始化
obj->Eat = rabbitEat;
obj->Run = rabbitRun;
} int main(void)
{
// 申请对象空间-兔子1
struct TRabbit Rabbit1;
// 申请对象空间-兔子2
struct TRabbit Rabbit2; // 创建兔子1对象
rabbitCreate(&Rabbit1);
Rabbit1.color = CL_WHITE;
Rabbit1.weight = 1.03;
Rabbit1.age = 3;
// 创建兔子2对象
rabbitCreate(&Rabbit2);
Rabbit2.color = CL_GRAY;
Rabbit2.weight = 1.28;
Rabbit2.age = 4; // 兔子1吃萝卜
Rabbit1.Eat(ID_CARROT);
// 兔子2跑
Rabbit2.Run(); return 0;
}

C语言结构体实例-创建兔子的更多相关文章

  1. 失落的C语言结构体封装艺术

    Eric S. Raymond <esr@thyrsus.com> 目录 1. 谁该阅读这篇文章 2. 我为什么写这篇文章 3.对齐要求 4.填充 5.结构体对齐及填充 6.结构体重排序 ...

  2. (转)失落的C语言结构体封装艺术

    目录1. 谁该阅读这篇文章 2. 我为什么写这篇文章 3.对齐要求 4.填充 5.结构体对齐及填充 6.结构体重排序 7.难以处理的标量的情况 8.可读性和缓存局部性 9.其他封装的技术 10.工具 ...

  3. Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

  4. GO语言学习(十六)Go 语言结构体

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

  5. 06. Go 语言结构体

    Go语言结构体(struct) Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类 ...

  6. Go 语言 结构体

    Go 语言 结构体 引言Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型结构体是由一系列具有相同类型或不同类型的数据构成的数据集合结构体表示一项记录,比如保存图书 ...

  7. 解析C语言结构体对齐(内存对齐问题)

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  8. c语言结构体3之结构体嵌套

    注意: 1结构体内部再次定义一个结构体 但是没有创建结构体的实例  也就是说再次定义的结构体内部的变量会被当做母结构体的成员变量 struct tianchao { int data; ]; stru ...

  9. Go语言结构体(struct)

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

随机推荐

  1. centos6.5 相关命令

    挂载U盘 1.进入mnt目录: #cd /mnt 2.新建一个USB目录: #mkdir usb 3.查看U盘的目录: #fdisk –l 4.挂载: #mount –t vfat /dev/sdb1 ...

  2. RabbitMQ:伪延时队列

    目录 一.什么是延时队列 二.RabbitMQ实现 三. 延时队列的问题 四.解决RabbitMQ的伪延时方案 ps:伪延时队列先卖个关子,我们先了解下延时队列. 一.什么是延时队列 所谓延时队列是指 ...

  3. MySQL-触发案列

    1.更新案例 DELIMITER $$ USE `haochacang`$$ DROP TRIGGER /*!50032 IF EXISTS */ `customer_info_update`$$ C ...

  4. Linux命令"ls"进阶说明

    pwd:the current working directory cd -: return to the previous working directory Filenames that begi ...

  5. Web核心之会话技术Cookie&Session

    什么是会话技术? http协议是无状态协议.为了满足在多次请求之间数据进行交互,推出了会话技术. 会话概念:一次会话,指的是从客户端和服务器建立起连接开始,到客户端或服务器断开连接为止.中间可能进行多 ...

  6. 【优化】Java开发中注意内存问题,影响JVM

    1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控 ...

  7. 【Http2.0】Http2.0

    序言 目前HTTP/2.0(简称h2)已经在广泛使用(截止2018年8月根据Alexa流行度排名的头部1千万网站中,h2占比约29%,https://w3techs.com/technologies/ ...

  8. BSGS算法(模板)

    BSGS (大步小步算法) 已知\(a.b. c\),求\(x\).令\(a^x \equiv b \pmod c\). 步骤 \[m = \lceil \sqrtc\ \rceil \]\[x = ...

  9. sql优化工具SQLAdvisor的安装

    原文地址:https://www.cnblogs.com/beliveli/articles/6541936.html 本机安装包路径: D:\share\src\linux-mysql\sqlAdv ...

  10. Python游戏

    要想实现键盘控制作用,就需要给游戏键盘监听事件利用pygame模块的key.get_pressed()方法,来检测按键是否按下 key_press =pygame.key.get_pressed() ...