/**************************
* 一. 关于结构变量的声明 *
**************************/
//-------------------------------------
// 创建一个名叫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)此次传递给函数的是一个指向结构的指针。
// 指针比整个结构要小的多,所以压到堆栈上效率
// 会提高很多。代价是使用间接访问来访问结构成员。
【Pointers On C】struct 详解
最新推荐文章于 2022-08-22 14:02:41 发布