1.首先使用关键字,表示后面是一个结构体。
2. 后面是一个可选的标志(书),它是用于引用结构的快速标记。
所以将来我们可以创建这样的数据对象
书; //设置为一个可以使用book结构的结构体变量,那么这个变量就包含了它的book结构中的所有元素
3、接下来是大括号,将结构体成员列表和各个成员变量括起来,使用自己的声明方式进行描述,并以分号结束;
例如:字符标题[]; 字符数组是这样声明的,并以分号结尾;
注意:每个成员可以使用任何C数据结构甚至其他结构,这也是可以的;
4. 右花括号后面的分号表示结构设计定义的结束。
2.2; 关于它的声明的位置,也就是这段代码应该放在哪里。 这也是有范围的。
如果这样的声明放置在任何函数之外,则可以在此文件中使用可选标记,并且声明后面的所有函数都可以使用它。
如果这样的声明位于函数内部,则其标记只能在内部且在其声明之后使用;
2.3; 关于我们一直说的,标签名称是可选的,那么什么时候可以省略,什么时候不能省略呢?
如果使用上面的声明式定义方式,并且想在一个地方定义结构设计,在其他地方定义实际的结构变量,就必须使用标签;
可以省略,结构体变量会在设计的同时创建,但这种设计是一次性的。
结构类型定义总结;
一般格式为;
结构体名称(即可选标记名称){ 成员变量; }; // 使用分号表示定义结束;
3.定义结构体变量
3.1; 前面我们的结构体类型的定义(结构体的声明)只是告诉编译器如何表示数据,但并没有让计算机为其分配空间。
如果我们要使用结构体,我们需要创建变量,这些变量就是结构体变量;
创建结构体变量; 书;
看到这条指令后,编译器将创建一个结构体变量。 这时编译器会按照书本模板为变量分配内存空间,这里的存储空间是和这个变量合并在一起的。
这也是我们后面访问结构体变量成员的时候,会使用结构体变量名来访问。
分析:
书的作用:
在结构体声明中,book 与 int、、、、等基本数据类型名称的作用相同。
书 s1、s2、*ss;
定义两个book结构类型的结构变量,同时定义一个指向该结构的指针。 它的 ss 指针可以指向 s1、s2 或任何其他 book 结构变量。
实际上;
书;
相当于;
书{
字符…
……
……
};
两者是等价的,但是第一个可以减少编写的代码量;
3.2; 现在我们回到刚才提到的问题,什么时候可以省略可选标识符;
一;
字符标题[];
字符[];
浮点值;
};
//注意这里不再定义结构体类型,而是直接创建结构体变量。 编译器会分配内存;
//这样,标识符,也就是结构体名,确实可以省略,但是只能使用一次; 因为这是; 将声明结构体的过程和定义结构体变量的过程结合起来; 并且成员变量没有初始化;
//如果你想多次使用一个结构体模块,这是行不通的;
第二;
定义一个新的类型名称来替换现有的类型名称,即对现有类型进行重命名;
一般格式为; 现有类型新类型名称;
int 埃莱姆;
{
整数日期;
……
……
};
斯图1,斯图2;
总结结构体变量的定义;
1; 先定义结构体类型,再定义结构体变量;
格式为; 结构体名称变量名称列表;
书 s1、s2、*ss; //注意,在此之前,必须先定义结构体类型,再定义变量;
2; 定义结构体类型的同时定义结构体变量;
格式为;
结构名称
会员名单;
}变量名称列表; //这里结构体名称可以省略,但尽量不要省略;
书
char title[];//字符串表示的标题;
char[];//用字符串表示的作者;
float value;//浮点类型表示的价值价格;
}s1,s2
3; 直接定义结构体类型变量,这是省略结构体名称的第二种情况;
该方法不能指定结构体类型名称,而是直接定义结构体变量,并且只适用于一次定义结构体变量的值。 没有结构名称的结构类型不能被重用。
也就是说,程序无法再次定义该类型的变量,除非重新写入。
4.结构体变量的初始化
4.1; 首先回忆一下基本数据类型和数组类型的初始化;
整数a = 0;
int 数组[4] = {1,2,3,4}; //每个元素之间用逗号分隔
回想一下数组初始化问题;
我们回到结构体变量的初始化吧?
结构体变量的初始化与数组的初始化类似;
它也是用大括号括起来并用逗号分隔的初始化项的列表。 请注意,每个初始化项必须与要初始化的结构体成员的类型相匹配。
book s1={//初始化结构体
"yuwen",//标题是一个字符串
"",//是字符数组
22.5 //值是扁平类型
};
//为了对应,用逗号分隔,和数组初始化一样;
4.2; 补充一点知识;
有关结构初始化和存储类周期的问题;
如果要初始化一个具有静态存储期的结构体,则初始化项列表中的值必须是常量表达式;
4.3; 注意,如果结构体变量在定义时没有初始化,那么以后就不能一起初始化;
它的意思是;
/////////这样就可以了,定义变量的时候就初始化了;
book s1={//初始化结构体
"",//是字符数组
"yuwen",//标题是一个字符串
22.5
};
/////////这行不通。 定义变量后,如果想给变量的成员赋值,只能赋值单个值;
书 s1;
s1={
"",//是字符数组
"yuwen",//标题是一个字符串
22.5
};//这不可能。 所有值只有在定义时初始化时才能赋值。 之后就不能再整体赋值,而只能单独赋值;
只可以;
s1.title = "yuwen";........................//单次赋值;
4.4; 结构体的指定初始化;
5. 访问结构体成员
5.1; 该结构就像一个超级数组。 在这个超级数组中,一个元素可以是char类型,下一个元素可以是flat类型,下一个元素也可以是int数组类型。 这些都是存在的。
在数组中,我们可以通过下标访问数组的每个元素。 那么我们如何访问该结构体的每个成员呢?
只需使用结构体成员运算符点(.);
结构体变量名.成员名;
注意,点的结合性是从左到右的,并且在所有运算符中具有最高的优先级;
例如s1.title指的是s1的标题部分,s1。 指s1的部分,s1.value指s1的value部分。
然后您可以像字符数组一样使用 s1.title,像浮点数据类型一样使用 s1.value;
请注意,虽然 s1; 是一个结构体,s1.value是float类型。
因此,s1.value相当于float类型变量名,按照float类型使用;
例如; ("%s\n%s\n%f",s1.title,s1.,s1.value);//访问结构体变量元素
注意 scanf(“%d”,&s1.value); 该语句包含两个运算符,& 和结构成员运算符点。
逻辑上应该把(s1.value,因为它们是整体,代表s1的value部分)括起来,但不括起来也是一样的,因为点的优先级比&高。
5.2; 如果其成员本身是结构体类型,则可以使用多个成员运算符逐级找到最低级别的成员,然后对其进行操作;
结构体变量名.....最低级别子成员;
日期
整数年;
整月;
国际日;
};
字符名称[10];
日期 ;
};
//如果要引用出生日期,可以表示为;..year;
是会员; 年份是会员;
5.3; 整体性与分离性
5.3.1; 可以将一个结构体变量作为一个整体赋值给另一个同类型的结构体变量,以达到整体赋值的效果; 这个成员变量的值会被整体赋值给另一个变量;
5.3.2; 结构体变量不能作为一个整体进行输入和输出; 输入和输出结构体数据时,必须单独指定结构体变量的每个成员;
总结:除了“同类型的结构体变量可以作为一个整体互相赋值”外,其他情况下是不能作为一个整体来引用的,而只能单独给各个成员引用;