码迷,mamicode.com
首页 > 其他好文 > 详细

【Pointers On C】struct 详解

时间:2015-05-13 12:55:56      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:struct   c   

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

//-------------------------------------
// 创建一个名叫x的<strong>变量</strong>				(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)的声明都是声明变量。

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

//-------------------------------------
// <strong>使用typedef创建新的类型</strong>			(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;
<strong>// 此时tooYoungTooSimple相当于struct
// Simple的别名,即 tooYoungTooSimple == struct Simpel</strong>


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

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

<strong>//1. 结构变量的成员可以同构(.)操作符访问
//	 点操作符接受2个操作数,左操作数就是
//	 结构变量的名字,右操作数是需要访问的
//	 成员的名字。如:    (直接访问)</strong>
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
<strong>// Note: (->)箭头操作符和(.)点操作符一样,
// 接受两个操作数,但左操作数必须是一个
// 指向结构的指针,箭头操作符对左操作数
// 访问取得指针所指向的结构。间接访问操作
// 内建于箭头操作符中</strong>



/**************************
 * 三、作为函数参数的结构 *
 **************************/
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);

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

【Pointers On C】struct 详解

标签:struct   c   

原文地址:http://blog.csdn.net/zone_programming/article/details/45690777

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!