#### 结构体
```c
struct student
{
const char *name;
const char *address;
int age;
};
```
struct student表示一个类型,类似于int,声明和初始化,以及使用如下:
```c
#include <stdio.h>
#include <string.h>
struct student
{
const char *name;
const char *address;
int age;
};
int main(int argc, char const *argv[])
{
struct student person = {"wuzhc", "Guangzhou", 18};
printf("%s\n", person.name);
return 0;
}
```
#### typeof别名
可以为结构体设置别名,如下
```c
typedef struct student
{
const char *name;
const char *address;
int age;
} stu;
```
其中结构体名可以省略,如下:
```c
typedef struct
{
const char *name;
const char *address;
int age;
} stu;
```
#### 结构体复制
当一个结构体变量赋值给另一个结构体变量时,计算机会创建一个全新的副本,如果结构体含有指针,那么复制的仅仅是指针的值,如下:
#### 嵌套结构
```c
#include <stdio.h>
#include <string.h>
typedef struct
{
const char *subject;
int score;
} report;
typedef struct
{
const char *name;
const char *address;
int age;
report card; // 这是一个嵌套结构体
} stu;
int main(int argc, char const *argv[])
{
stu person = {"wuzhc", "Guangzhou", 18, {"english", 59}};
printf("%s\n", person.card.subject);
return 0;
}
```
#### 结构体指针
类似于其他类型指针,代码如下:
```c
void modifyAge(stu *s)
{
s->age = 23;
// 等价于(*s).age = 23
}
```
#### 联合union
当定义联合时,计算机会为最大的字段分配空间,如php的zend_value如下:
```c
typedef union _zend_value {
zend_long lval; //int整形
double dval; //浮点型
zend_refcounted *counted;
zend_string *str; //string字符串
zend_array *arr; //array数组
zend_object *obj; //object对象
zend_resource *res; //resource资源类型
zend_reference *ref; //引用类型,通过&$var_name定义的
zend_ast_ref *ast; //下面几个都是内核使用的value
zval *zv;
void *ptr;
zend_class_entry *ce;
zend_function *func;
struct {
uint32_t w1;
uint32_t w2;
} ww;
} zend_value;
```
初始化:
```c
zend_value zv = {.dval=1.5}
```
#### 枚举
关键字enum,定义如下:
```c
typeof enum {
COUNT, POUNDS, PINTS
} unit;
```
#### 位字段
用位字段主要用于减少占用空间,如定义一个结构如下:
```c
typedef struct
{
unsigned int fist_visit:1;
unsigned int come_age:1;
unsigned int fingers_lost:4;
unsigned int days_a_week:3;
} survey;
```
位字段应当声明为unsigned int;只有出现在同一个结构中,位字段才能节省空间
#### 位字段和数值计算
最大值 = 2^位数 - 1,即4位只能保存0到15的值
#### demo
```c
#include <stdio.h>
#include <string.h>
// 枚举
typedef enum
{
PREPATE_TYPE, HOMEWORK_TYPE, SCANEXAM_TYPE
} sourceType;
// 联合
typedef union
{
short count;
short weight;
} quantity;
// 结构体
typedef struct
{
const char *subject;
int score;
} report;
// 结构体
typedef struct
{
const char *name;
const char *address;
int age;
report card; // 这是一个嵌套结构体
sourceType type;
quantity q;
} stu;
// 位字段
typedef struct
{
unsigned int fist_visit:1;
unsigned int come_age:1;
unsigned int fingers_lost:4;
unsigned int days_a_week:3;
} survey;
// 结构体指针
void modifyAge(stu *s)
{
s->age = 23;
// 等价于(*s).age = 23
}
int main(int argc, char const *argv[])
{
stu person = {"wuzhc", "Guangzhou", 18, {"english", 59}, HOMEWORK_TYPE, {.weight=118}};
if (person.type == HOMEWORK_TYPE) {
printf("%s\n", "homework");
} else {
printf("%s\n", "other");
}
modifyAge(&person);
printf("%i\n", person.age);
printf("%i\n", person.q);
return 0;
}
```
- php
- 编译安装
- 基本概念
- 垃圾回收机制
- 生命周期
- zval底层实现
- c扩展开发
- gdb调试工具
- 自定义扩展简单demo
- 钩子函数
- 读取php.ini配置
- 数组
- 函数
- 类
- yaf扩展底层源码
- swoole扩展底层源码
- memoryGlobal内存池
- swoole协程使用记录
- 单点登录sso原理
- compser使用
- session实现机制
- c & linux
- gcc
- 指针
- 结构体,联合和位字段
- 宏定义井号说明
- printf家族函数和可变参数
- 共享函数
- 静态库和动态库
- makefile自动化构建
- 信号一
- 信号二
- inotify监控文件事件
- socket编程
- 简介
- UNIX DOMAIN
- Internet DOMAIN
- TCP/IP
- 文件IO多路复用
- 内存管理
- 进程组,会话和控制终端
- daemon守护进程
- 多进程
- 多线程
- 常用进制转换
- go
- 入门知识
- 字节和整数装换
- python
- redis
- 应用场景
- 消息队列
- 热点数据
- 扫码登录
- 订阅发布
- 次数限制
- 抢购超卖
- 持久化机制
- mysql
- 工作流程
- MyISAM和InnoDB区别
- 用户和权限管理
- 执行计划
- sql优化
- 事务和锁
- 慢查询日志
- case...when...then...end用法
- sql
- 参考
- linux
- 内核参数优化
- 防火墙设置
- docker
- docker入门知识
- 算法
- 多维数组合
- DFA算法
- 红包金额分配