【Pointers On C】struct 详解

/**************************
 * 一. 关于结构变量的声明 *
 **************************/

//-------------------------------------
// 创建一个名叫x的变量				(1)
struct {
	int		 a;
	char	 b;
	float	 c;
}x;

// 创建变量一个数组y,
// 包含了20个结构。z是
// 指针,指向这个类型的结构。		(2)
struct {
	int		 a;
	char	 b;
	float	 c;
}y[20], *z;
// 注意: 两个声明即使成员列表完全相同
// 但是被认为是两者截然不同的类型
// 因此, z = &x是非法的。
// (1)和(2)的声明都是声明变量。

//-------------------------------------
// 声明结构标签,没有创建任何变量	(3)
struct Simple{
	int		 a;
	char	 b;
	float	 c;
};
// 可以使用结构标签来创建变量
struct Simple x;
struct Simpe y[20], *z;
// 此时x,y,z都是同一种类型的结构变量

//-------------------------------------
// 使用typedef创建新的类型			(4)
typedef struct {
	int		 a;
	char	 b;
	float	 c;
}Simple;
// 此时和(3)声明一个结构标签的效果基本
// 完全相同。区别在于Simpe此时是一个类
// 型名而不是结构标签。所以声明可以如下:
Simple x;
Simple y[20], *z;

//                                  (5)
typedef struct Simpe {
	int		 a;
	char     b;
	float	 c;
}tooYoungTooSimple;
// 此时tooYoungTooSimple相当于struct
// Simple的别名,即 tooYoungTooSimple == struct Simpel


/**********************
 * 二. 结构成员的访问 *
 **********************/

struct COMPLEX {
	float	 f;
	int		 a[20];
	long	 *lp;
	struct	 Simple	s;
	struct	 Simple sa[10];
	struct	 Simple *sp;
};

//1. 结构变量的成员可以同构(.)操作符访问
//	 点操作符接受2个操作数,左操作数就是
//	 结构变量的名字,右操作数是需要访问的
//	 成员的名字。如:    (直接访问)
struct COMPLEX comp;
float t = comp.f;
float st = ((comp.sa)[4]).c; // st = comp.sa[4].c;

//2. 结构成员的间接访问, 如:
void func(struct COMPLEX *cp);
// 访问变量所指向的结构成员f:
// 方法1:
float t  = (*cp).f;
// 方法2:
float t2 = cp->f
// Note: (->)箭头操作符和(.)点操作符一样,
// 接受两个操作数,但左操作数必须是一个
// 指向结构的指针,箭头操作符对左操作数
// 访问取得指针所指向的结构。间接访问操作
// 内建于箭头操作符中



/**************************
 * 三、作为函数参数的结构 *
 **************************/
typedef struct {
	char	product[PRODUCT_SIZE];
	int		quantity;
	float	unit_price;
	float	total_amount;
} Transaction;

// 两种不同的方法打印结构
// **(1)**
void print_receipt(Transaction trans)
{
	printf("%s", trans.product);
	//...
}
print_receipt(current_trans);

// **(2)**
void print_receipt(Transaction *trans)
{
	printf("%s", trans->product);
}
print_receipt(¤t_trans);

// 结果对比
// *(1)可以产生正确结果,但是效率低,因为C语言
// 要求把参数的一份拷贝传递给函数,所以在传递
// 时必须把结构的搜有字节复制到堆栈中
// *(2)此次传递给函数的是一个指向结构的指针。
// 指针比整个结构要小的多,所以压到堆栈上效率
// 会提高很多。代价是使用间接访问来访问结构成员。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值