提示
结构类型与结构变量是两个不同的概念。定义一个结构类型时只是给出该结构的组织形式,并没有给出具体的组织成员,结构名不占用任何存储空间,不能对结构名进行赋值、存取和运算。而结构变量则是一个结构中的具体成员,编译器会为具体的结构变量名分配确定的存储空间,因此可以对结构变量名赋值、存取和运算。
将-个变量定义为基本类型与将其定义为结构类型的不同之处是:前者只是说明变量的类型,后者不仅说明该变量为结构类型,同时还要指出该变量所属结构类型的名字。
一个结构中的结构元素可以是另外一个结构类型的变量,即可以形成结构的嵌套。
例如:
其中,结构类型mrec中的结构元素time又是另一个结构类型clock的结构变量,形成了结构的结构,即结构的嵌套,结构的嵌套可以是多层次的,但这种嵌套不能包含其自身,即结构不能自己定义自己。
结构中的结构元素可以与结构外其他变量同名。它们各自代表不同的对象,在使用中不会互相影响。
在定义结构变量时,还可以说明它的存储种类,可以extern、auto和static三种形式。
2. 结构变量的引用
结构变量定义之后就要考虑对它的引用问题(赋值、存取、运算)。对结构变量的引用是通过所属的结构元素的引用实现的。引用结构元素的一般格式为:
结构变量名.结构元素
其中“.”是存取结构元素的成员运算符。如d1.month表示结构变量d1中的成员month。如果-个结构变量中的结构元素又是另外一个结构变量.即出现结构的嵌套时,则需要采用若干个成员运算符一级一级地找到最低一级的结构元素,而且只能对这个最低级的结构元素进行访问,例:m1.time.min。
对结构变量中的各个元素可以像普通变量一样进行赋值、存取和运算。
例:
d1.year=2006;
sum=d1.day d2.day;
d1.month ;
m1.time.hour=0x22;
成员运算符的优先级别最高。
对于结构变量和结构元素在程序可以直接引用它们的地址。
例:scanf(“%d”&d1.year);
结构变量的地址通常用作函数参数,用来传递结构的地址。
3. 结构变量的初值
当结构变量为外部全局变量或静态变量时可以在定义结构类型时给它赋初值,但不能给自动存储种类的动态局部结构变量赋初值。
例如:
自动结构变量不能在定义时赋初值,只能在程序执行中用赋值语句为各结构元素分别赋值。结构变量初值个数必须小于等于结构变量中元素的个数。初值不够时,余下的结构变量元素以0为其初值,如果初值个数多于元素个数时则会导致编译出错。
4. 结构数组
在实际使用中,结构变量往往不止一个,通常是将多个相同的结构组成一个结构数组,结构数组的定义方法与结构变量完全一致。
例如:
例:结构数组赋初值