[源码下载]

不可或缺 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 = ;
employee1.name = "webabcd";
employee1.sarlary = 100.5f;
employee1.birthday.year = ;
employee1.birthday.month = ;
employee1.birthday.day = ; // 占用内存空间为 24 字节
int size = sizeof(struct employee);
} // 结构体基础 2
void struct_demo2()
{
// 常用的结构体类型可以用宏定义来表示(也可以用 typedef, 后面再说)
#define EMPLOYEE struct employee
EMPLOYEE
{
int num;
char *name;
} employee1, employee2 = { , "webabcd" }; // 声明结构体变量的时候就可以对其初始化
EMPLOYEE employee3 = { , "webabcd" }; // 针对指定的成员做初始化(这个在 vs 里没调通,在 xcode 是可以的)
// struct employee emp = { .name = "webabcd" }; // 在定义结构体类型的时候,就声明变量的话,可以省去结构体名
struct
{
int num;
char *name;
} employee4, employee5 = { , "webabcd" }; // 声明结构体变量的时候就可以对其初始化 // 相同类型的结构体是可以互相赋值的,其成员无论是基本类型还是指针都会复制出一份新的
employee1 = employee2;
employee2.num = ;
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 = { , "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[] =
{
{ , "webabcd" },
{ , "wanglei" }
}; // 结构体数组和指针的关系,与一般数组和指针的关系是一样的
struct employee *employee1 = employees;
struct employee *employee2 = &employees[];
} // 共用体(联合体)
void union_demo()
{
// 所谓共用体,就是让几个变量共用一个内存空间,共用体占用空间大小为该共用体最大基本类型成员的整倍数,且大小要正好包含住共用体最大类型成员
// 注:以下如果有列出结果的,均为我的环境的结果。比如我这里 int 是占用 4 个字节的 union u // 占用 4 个字节(a 占用 4 个字节,b 占用 4 个字节,由于他们共用一个内存空间,所以这个共用体占用 4 个字节)
{
int a;
int b;
} u1; u1.a = ;
u1.b++;
// 上面执行后的结果是 u1.a 等于 2,u1.b 等于 2,因为他们是共用一个内存空间 union // 占用 12 个字节(a 占用 4 个字节,b 占用 10 个字节,该共用体最大基本类型为 int,它占 4 个字节,以它来对齐,则这个共用体占用 12 个字节)
{
int a; // 共用体最大基本类型成员
char s[]; // 共用体最大类型成员
} u2; u2.a = 0x61626364; // abcd
char s1 = u2.s[]; // d
char s2 = u2.s[]; // c
char s3 = u2.s[]; // b
char s4 = u2.s[]; // 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 == )
{
// 用枚举值索引复制枚举值时,需要强制类型转换
weekday e = (enum weekday); // 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[];
NAME a1, a2; // STR 类型就是 char 指针
typedef char *STR;
STR s1, s2; // EMP 类型就是 struct employee 结构体
typedef struct employee
{
int num;
char *name;
} EMP;
EMP emp1 = { , "webabcd" }; // 注:宏定义是字符串替换,typedef 是类型替换;宏定义是由预处理完成的,typedef 则是在编译时完成的
}

OK
[源码下载]

不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符的更多相关文章

  1. 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域

    [源码下载] 不可或缺 Windows Native (9) - C 语言: 动态分配内存,链表,位域 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 动态分配内存 链 ...

  2. 不可或缺 Windows Native (10) - C 语言: 文件

    [源码下载] 不可或缺 Windows Native (10) - C 语言: 文件 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 文件 示例cFile.h #ifn ...

  3. 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等

    [源码下载] 不可或缺 Windows Native (3) - C 语言: 运算符,表达式,条件语句,循环语句,转向语句,空语句等 作者:webabcd 介绍不可或缺 Windows Native  ...

  4. 不可或缺 Windows Native (1) - C 语言: hello c

    [源码下载] 不可或缺 Windows Native (1) - C 语言: hello c 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 在 Windows Sto ...

  5. 不可或缺 Windows Native (2) - C 语言: 常量,变量,基本数据类型

    [源码下载] 不可或缺 Windows Native (2) - C 语言: 常量,变量,基本数据类型 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 常量 变量 基本 ...

  6. 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出

    [源码下载] 不可或缺 Windows Native (4) - C 语言: 预处理命令,输入,输出 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 预处理命令 输入 ...

  7. 不可或缺 Windows Native (5) - C 语言: 数组

    [源码下载] 不可或缺 Windows Native (5) - C 语言: 数组 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 数组 示例cArray.h #ifn ...

  8. 不可或缺 Windows Native (6) - C 语言: 函数

    [源码下载] 不可或缺 Windows Native (6) - C 语言: 函数 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 函数 示例cFunction.h # ...

  9. 不可或缺 Windows Native (7) - C 语言: 指针

    [源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...

随机推荐

  1. mac或linux下xampp的mysql配置

    在mac 下安装好xampp后,需要在终端命令行操作时,比如输入:mysql -u root -p,未正确配置前不会出现想要的输入密码提示,而是会提示: command not found 原来当你输 ...

  2. thinkphp的伪静态化

    1. 设置默认的控制器和模块 // 绑定访问Admin模块 define('BIND_MODULE','Home'); // 绑定访问Index控制器 define('BIND_CONTROLLER' ...

  3. cocos2dx 帧动画的两种创建方式

    看了好几天cocos2dx的帧动画,现在才有点眉目,为了高效期间我们一般会用到 精灵帧缓存(CCSpriteFrameCache) 和动画缓存(CCAnimationCache) .大体的操作步骤: ...

  4. 移动端使用HTML5表单增强体验

    我们知道,HTML5新增了许多表单类型,如: number,email,url,tel,datetime,month,datetime-local等等,像datetime,month这些非常方便,免得 ...

  5. Android odex文件反编译

    odex 是经过优化的dex文件,且独立存在于apk文件.odex 多用于系统预制应用或服务.通过将apk中的dex文件进行 odex,可以加载 apk 的启动速度,同时减小空间的占用.请参考ODEX ...

  6. 读书笔记_Effective_C++_条款四十一:了解隐式接口和编译期多态

    从本条款开始,就进入了全书的第七部分:模板与泛型编程.模板与泛型在C++中是非常重要的部分,还记得本书第一章时,把C++视为一个联邦,它由四个州政府组成,其中一个政府就是模板与泛型了. 本条款是一个介 ...

  7. Reveal查看任意app的高级技巧(转)

    原文:http://zhuanlan.zhihu.com/iOSRe/19646016 Reveal查看任意app的高级技巧 hangcom · 12 小时前 Reveal是一个很强大的UI分析工具, ...

  8. Xcode 中关于"#"的小知识

    在代码中使用Autolayout时,大家都会使用NSDictionaryOfVariableBindings这个宏,这个宏可以生成一个变量名到变量值映射的Dictionary.比如NSDictiona ...

  9. Cannot find SS.INI file for user *** 解决方法

    昨天还用的好好的VSS今天早上一来就提示: Cannot find SS.INI file for user *** 度娘了一下,好像都是说的: 1,vss\users\***\  下无文件SS.IN ...

  10. CentOS下Redis服务器安装配置

    说明: 操作系统:CentOS 1.安装编译工具 yum install wget  make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-de ...