【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;charb;float c;}tooYoungTooSimple;// 此时tooYoungTooSimple相当于struct// Simple的别名,即 tooYoungTooSimple == struct Simpel/********************** * 二. 结构成员的访问 * **********************/struct COMPLEX {float f;int a[20];long *lp;struct Simples;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 {charproduct[PRODUCT_SIZE];intquantity;floatunit_price;floattotal_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)此次传递给函数的是一个指向结构的指针。// 指针比整个结构要小的多,所以压到堆栈上效率// 会提高很多。代价是使用间接访问来访问结构成员。

积极的人在每一次忧患中都看到一个机会,

【Pointers On C】struct 详解

相关文章:

你感兴趣的文章:

标签云: