结构变量是标量,和其他变量无差别。
1:结构变量当然也可以作为函数参数,但是一般不这样用,因为效率低。
一般都是用指向结构的指针作为参数
2:(重要!)
以下两个结构变量对于编译器来说是不同的。虽然它们的成员列表完全相同。
如:
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}y;
那怎么办,别害怕,
方法一:
我们有标签字段。标签字段允许为*成员列表*提供一个名字。
如:
struct SIMPLE{
int a;
char b;
float c;
};
这时候,这个声明把标签SIMPLE和这个成员列表联系起来。
所以,这时候定义变量如下形式:
struct SIMPLE x;
struyct SIMPLE y[20],*z;
这时候 (x,y,z)都是同一个类型了
方法二:typedef
typedef struct{
int a;
char b;
float c;
}Simple;
使用typedef 创建一种新的类型。区别在于simple 现在是个类型名而不是个结构标签。
定义变量方式如下:
Simple x;
不需要加struct了。
总结:理解 两种方式
1:标签 的作用。以及如何定义结构变量。形式如右:struct 标签 变量名
2:typedef 的方式
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
结构变量的两个操作符
1:.操作符,左操作数为 结构变量名,右操作数为成员变量名(对结构成员直接访问)
2:->操作符,左操作数为 指向结构变量的指针,右操作数为成员变量名(对结构成员间接访问)
ps:->操作符中内置蕴含了 间接访问操作。
如:(*cp).f 与cp->f 这两个表达式作用是一样的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
结构的自引用,合法的方式和不合法的方式。
1合法的是:结构内部 有 该结构类型的指针
2:不合法的是:结构内部有 该结构类型的变量
总结:正是因为结构有这种技巧,结构内部可以有自引用,即可以有指向结构类型的指针,这种特性。
我们可以使用这种特性,去实现高级数据结构(如:链表,如树等)
注意理解本质!本质是,因为C语言的结构这种数据类型,具有了这种特性,所有我们才选用 结构,去实现链表、树。
C语言自带的 #####这种技巧,这种特性#####
即C语言中的结构变量,可以有自引用的合法能力。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
结构变量的操作符没几个,可是具体的使用变量去访问 成员,这些内容还挺多,挺复杂的。
待续:见(10.2 结构、指针和成员章节)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~