# C和指针---第十章：结构和联合 原

fzyz_sb

10.1 结构基础知识

10.1.1 结构声明

``struct tag { member-list } variable-list;``

``````struct {
int		a;
char	b;
float	c;
} x;``````

``````struct {
int    a;
char	b;
float	c;
} y[20], *z;``````

``z = &x;``

``````struct SIMPLE {
int	a;
char	b;
float	c;
};``````

``````struct SIMPLE x;
struct SIMPLE y[20], *z;``````

``````typedef struct {
int	a;
char	b;
float	c;
} Simple;``````

``````Simple x;
Simple y[20], *z;``````

10.1.2 结构成员

``````struct COMPLEX{
float	f;
int	a[20];
long	*lp;
struct SIMPLE	a;
struct SIMPLE	sa[10];
struct SIMPLE	*sp;
};``````
10.1.3 结构成员的直接访问

10.1.4 结构成员的间接访问

10.1.5 结构的自引用

``````struct SELF_REF1{
int		a;
struct	SELF_REF1 b;
int		c;
};``````

``````struct SELF_REF1{
int		a;
struct	SELF_REF2 *b;
int		c;
};``````

``````typedef struct {
int		a;
struct	SELF_REF3 *b;
int		c;
} SELF_REF3;``````

``````typedef struct SELF_REF3_TAG {
int		a;
struct	SELF_REF3_TAG *b;
int		c;
} SELF_REF3;``````
10.1.6 不完整的声明

``````struct B;

struct A {
struct B	*partner;
};

struct B {
struct A	*partner;
};``````
10.1.7 结构的初始化

``````struct INTF_EX {
int		a;
short	b[10];
Simple  c;
}x = {
10,
{
1,2,3,4,5
},
{
25, 'x', 1.9
}
};``````
10.2 结构，指针和成员
``````typedef struct {
int	a;
short	b[2];
} Ex2;
typedef struct Ex{
int	a;
char	b[3];
Ex2	c;
struct	Ex	*d;
} Ex;

Ex x = {10, "Hi", { 5, { -1, 25 }, }, 0 };
Ex *px = &x;``````

10.2.2 访问结构

10.2.3 访问结构成员

*px和px->a。它们有什么区别？

1. 它们具有相同的地址，所以*px == px->a。

2. 但是，它们类型是不同的！！！变量px被声明为一个指向结构的指针，所以表达式*px的结果是整个结构，而不是它的第一个成员。

``int *pi;``

``pi = &px->a;``
10.2.4 访问嵌套的结构

``*px->c.b;``

10.2.5 访问指针成员

``px->d;``

``*px->d;``

``````Ex    y;
x.d = &y;
px->d->c.b[1];``````

10.4 作为函数参数的结构

``````typedef struct {
char	product[PRODUCT_SIZE];
int	quantity;
float	unit_price;
float	total_amount;
} Transaction;``````

``````void print_receipt( Transcation trans ){
printf("%s\n", trans.product);
printf("%d @ %.2f total %.2f\n", trans.quantity, trans.unit_price, trans.total_amount );
}``````

``````void print_receipt( Transcation *trans ){
printf("%s\n", trans->product);
printf("%d @ %.2f total %.2f\n", trans->quantity, trans->unit_price, trans->total_amount );
}``````

10.6 联合

``````#include <stdio.h>

int main(void)
{
union {
float	f;
int	i;
} fi;

fi.f = 3.14159;
printf("%d\n", fi.i );
printf("%d\n", (int)fi.f );

return 0;
}``````

10.6.2 联合的初始化

``````union {
int	a;
float	b;
char	c[4];
} x = { 5 };``````

1.

``````#define MAX_SIZE 128
typedef struct {
long	num1;
long	num2;
long	num3;
}Num;
struct inf{
char	date[MAX_SIZE];
char	time[MAX_SIZE];
struct	telephoneNumber
{
Num		yourNum;
Num		otherNum;
Num		payNum;
};
};``````

2.

``````typedef struct Money{
float	msrp;
float	asp;
float	st;
float	lf;
}Money;

typedef struct Sales{
float	msrp;
float	asp;
float	dp;
float	sd;
float	mp;
int	lt;
}Sales;

typedef struct RunSales{
float	msrp;
float	asp;
float	st;
float	lf;
float	dp;
int	ld;
float	ir;
float	mp;
char	nob[20];
};

struct inf{
char	name[20];
union model{
Money		moneyModel;
Sales		salesModel;
RunSales	runsalesModel;
};
};``````

### fzyz_sb

golang 内存分析之字节对齐规则

c 的字节对齐很重要，因为c 支持指针运算。在golang 里面一般是慎用指针运算的，所以，这部分很少用，但是有些场景为了性能不得不用到指针运算，这个时候，知道golang 的内存分配就很重要了。...

06/12
0
0
Head First C 学习日志 第十章 进程间通信 捕捉信号

Head First C 第十章 进程间通信 捕捉信号 关于信号 信号是操作系统控制程序的方式，举个栗子，操作系统在看到用户输入了Ctrl+C时，就会向程序发送中断信号。信号映射表 | 信号 | 处理函数 ...

AlexTuan
2016/04/17
32
0
《程序员面试宝典》精华 编程语言部分

《程序员面试宝典》精华 编程语言部分 正所谓取其精华，去其糟粕。本文谨记录下《程序员面试宝典》一些关键的知识点、易错点，对于一些虽然重要但书中没有解释清楚的地方不做记录。当然这里的...

modernizr
2014/08/11
410
2
JavaScript 入门教程--WisdomPlanet-Javascript-Primer

WisdomPlanet-Javascript-Primer 是智慧星球 Javascript 入门教程。 本教程写给：正准备踏入编程之路或对 Javascript 感兴趣的同学 作者 念念之间 版权声明 本文允许您用于非商业用途，若有商...

2015/04/01
1K
0
《HTML+CSS3权威指南》笔记摘要 - 目录

Contac
2011/12/02
0
1

[Hive]JsonSerde使用指南

Mr_yul
15分钟前
0
0
54:mysql修改密码|连接mysql|mysql常用命令

1、mysql修改密码： root用户时mysql的超级管理员,默认mysql的密码是空的,直接可以连接上去的,不过这样不安全； 注释：为了方便的使用mysql,需要把mysql加入到环境变量里； #后续自己输入mys...

22分钟前
0
0

<span ref="spanContentOne" id="spanContentOne" style="font-size: 14px;">或许不是最亮眼，总比瞎买强一点</span><!--<input type="button" @click="copyClick('1')" value="复制" />-......

26分钟前
0
0

linuxprobe16
28分钟前
0
0