/************************** * 一. 关于结构变量的声明 * **************************/ //------------------------------------- // 创建一个名叫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>
原文地址:http://blog.csdn.net/zone_programming/article/details/45690777