设为首页 收藏本站
查看: 1415|回复: 0

不可或缺 Windows Native (8)

[复制链接]

尚未签到

发表于 2015-5-23 06:03:39 | 显示全部楼层 |阅读模式
  [源码下载]




不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符  
作者:webabcd

介绍
不可或缺 Windows Native 之 C 语言


  • 结构体
  • 共用体
  • 枚举
  • 类型定义符
  
示例
cStruct.h



#ifndef _MYHEAD_STRUCT_
#define _MYHEAD_STRUCT_
#ifdef __cplusplus  
extern "C"
#endif  
char *demo_cStruct();
#endif  
  
cStruct.c



/*
* 结构体,共用体,枚举,类型定义符
*
* 注:结构体变量在做参数传递时,其内每个成员都会被传递,会降低效率。所以一般通过结构体指针传递
*/

#include "pch.h"
#include "cStruct.h"
#include "cHelper.h"

void struct_demo1();
void struct_demo2();
void struct_demo3();
void struct_demo4();
void union_demo();
void enum_demo1();
void typedef_demo1();

// 定义一个名为 birth 的结构体类型
/*
* struct 结构名
* {
*     成员表列
* };
*/
struct birth
{
int year; // 结构体成员
int month; // 结构体成员
int day; // 结构体成员
};

char *demo_cStruct()
{
// 结构体基础 1
    struct_demo1();
// 结构体基础 2
    struct_demo2();
// 结构体指针(指向结构体变量的指针)
    struct_demo3();
// 结构体数组
    struct_demo4();

// 共用体(联合体)
    union_demo();

// 枚举
    enum_demo1();

// 类型定义符
    typedef_demo1();

return "看代码及注释吧";
}

// 结构体基础 1
void struct_demo1()
{
// 定义一个名为 employee 的结构体类型
struct employee
{
int num; // 结构体成员
char *name = "unknown"; // 结构体成员,可以为其设置默认值(c++)
float sarlary; // 结构体成员
struct birth birthday; // 结构体成员,可以是另一个结构体
    };
// 声明一个 employee 类型的结构体
struct employee employee1;
// 为结构体赋值(访问结构体成员通过“.”来实现)
employee1.num = 100;
employee1.name = "webabcd";
employee1.sarlary = 100.5f;
employee1.birthday.year = 1980;
employee1.birthday.month = 2;
employee1.birthday.day = 14;
// 占用内存空间为 24 字节
int size = sizeof(struct employee);
}

// 结构体基础 2
void struct_demo2()
{
// 常用的结构体类型可以用宏定义来表示(也可以用 typedef, 后面再说)
#define EMPLOYEE struct employee
EMPLOYEE
{
int num;
char *name;
} employee1, employee2 = { 100, "webabcd" }; // 声明结构体变量的时候就可以对其初始化
EMPLOYEE employee3 = { 100, "webabcd" };
// 针对指定的成员做初始化(这个在 vs 里没调通,在 xcode 是可以的)
// struct employee emp = { .name = "webabcd" };
// 在定义结构体类型的时候,就声明变量的话,可以省去结构体名
struct
{
int num;
char *name;
} employee4, employee5 = { 100, "webabcd" }; // 声明结构体变量的时候就可以对其初始化

// 相同类型的结构体是可以互相赋值的,其成员无论是基本类型还是指针都会复制出一份新的
employee1 = employee2;
employee2.num = 99;
employee2.name = "wanglei";
// 结果:employee1(num=100, name="webabcd"), employee2(num=99, name="wanglei")
}

// 结构体指针(指向结构体变量的指针)
void struct_demo3()
{
struct employee
{
int num;
char *name;
};
struct employee employee1 = { 100, "webabcd" };
// 定义一个结构体指针(指向结构体变量的指针)
struct employee *employee = &employee1;
char *name = employee1.name;
// (*employee) - 是结构体指针所指向的结构体内容
name = (*employee).name;
// 如果通过结构体指针访问结构体指针所指向的结构体的成员的话,通过“->”来实现
name = employee->name;
}

// 结构体数组
void struct_demo4()
{
struct employee
{
int num;
char *name;
};
// 定义一个结构体数组
struct employee employees[2] =
{
{ 100, "webabcd" },
{ 200, "wanglei" }
};
// 结构体数组和指针的关系,与一般数组和指针的关系是一样的
struct employee *employee1 = employees;
struct employee *employee2 = &employees[0];
}

// 共用体(联合体)
void union_demo()
{
// 所谓共用体,就是让几个变量共用一个内存空间,共用体占用空间大小为该共用体最大基本类型成员的整倍数,且大小要正好包含住共用体最大类型成员
// 注:以下如果有列出结果的,均为我的环境的结果。比如我这里 int 是占用 4 个字节的

union u // 占用 4 个字节(a 占用 4 个字节,b 占用 4 个字节,由于他们共用一个内存空间,所以这个共用体占用 4 个字节)
    {
int a;
int b;
} u1;
u1.a = 1;
u1.b++;
// 上面执行后的结果是 u1.a 等于 2,u1.b 等于 2,因为他们是共用一个内存空间


union // 占用 12 个字节(a 占用 4 个字节,b 占用 10 个字节,该共用体最大基本类型为 int,它占 4 个字节,以它来对齐,则这个共用体占用 12 个字节)
    {
int a; // 共用体最大基本类型成员
char s[10]; // 共用体最大类型成员
    } u2;
u2.a = 0x61626364; // abcd
char s1 = u2.s[0]; // d
char s2 = u2.s[0]; // c
char s3 = u2.s[0]; // b
char s4 = u2.s[0]; // a
// 由上可见,我的 cpu 是小端模式,即高地址存高字节,低地址存低字节
// 注:网络字节顺序是按大端模式,即高位数据存放在低位地址(可以通过 ntohs, ntohl, htons, htonl 做转换)
}

// 枚举
void enum_demo1()
{
/*
* enum 枚举名
* {
*     枚举值表
* };
*/
// 定义一个名为 weekday 的枚举类型
enum weekday
{
sun, mon, tue, wed, thu, fri, sat
} a, b, c = fri; // 声明并初始化枚举变量
// 声明一个 weekday 类型的枚举变量,并初始化
weekday d = sat; // 枚举值不是字符串呦
// 判断一个枚举值的话,可以用枚举值或枚举值索引
if (d == sat && d == 6)
{
// 用枚举值索引复制枚举值时,需要强制类型转换
weekday e = (enum weekday)3; // wed
    }

// 在定义枚举类型的时候,就声明变量的话,可以省去枚举名
enum
{
v1, v2, v3
} e1, e2, e3 = v3;
}

// 类型定义符
void typedef_demo1()
{
// typedef - 类型定义符

// INTEGER 类型就是 int 类型
typedef int INTEGER;
INTEGER a, b;
// INTP 类型就是指向 int 类型的指针
typedef int* INTP;
// NAME 类型就是长度为 20 的 char 数组
typedef char NAME[20];
NAME a1, a2;
// STR 类型就是 char 指针
typedef char *STR;
STR s1, s2;
// EMP 类型就是 struct employee 结构体
typedef struct employee
{
int num;
char *name;
} EMP;
EMP emp1 = { 100, "webabcd" };

// 注:宏定义是字符串替换,typedef 是类型替换;宏定义是由预处理完成的,typedef 则是在编译时完成的
}
  
OK
[源码下载]

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-69641-1-1.html 上篇帖子: Windows Phone 8 学习志(探索问题一:如何简单利用Windows Phone Runtime Component项目类型实现C#和C++交互) 下篇帖子: Windows 8实用窍门系列:19.Windows 8中的GridView使用(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表