C语言结构体变量与链表知识总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例 11.2 比较结构体成员的几种引用方式 #include “stdio.h” Main(){ Struct student{
Long int num; Char name[20]; Char sex; Float score; }; Struct student stu_1; Struct student *p; P=&stu_1; Stu_1.num=200601; Strcpy(stu_1.name,”liping”); Stu_1.sex=’M’; Stu_1.score=811.5; Printf(“No.:%ld\nname:%ssex:%c\nscore:%f\n”,stu_1.num,sut_1.name,stu_1.score);
2.结构体变量所占内存的字节数 ·struct 类型用内存字节数=? ·是所有成员变量的内存总和吗? 用运算符 sizeof 获得结构体大小 Sizeof(变量或表达式) Sizeof(类型)
Typedef struct sample { Char m1; Int m2; Char m3; }SAMPLE; Printf(“%d\n”,sizeof(struct sample)); Printf(“%d\n”,sizeof(SAMPLE));
11.2 结构体类型变量 11.2.1 结构体类型变量的定义 1.先定义结构体类型,再定义结构体变量 形式: Struct 结构体名
{类型标识符 1 成员名 1; 类型标识符 2 成员名 2; …… 类型标识符 n 成员名 n;
}; Struct 结构体名 变量名表; 例如: Struct student {char name[20];
11.2.2 结构体变量的使用 结构体是一种新的数据类型,因此结构体变量也可以像其它类型的变量一样赋值、运算,不 同的是结构体变量以成员作为基本变量。 结构体成员的表示方式为:结构体变量名.成员名 其中的圆点运算符称为成员运算符,它的运算级别最高。 如果将“结构体变量名.成员名”看成一个整体,则这个整体的数据类型与结构体中该成员 的数据类型相同,这样就可以像前面所讲的变量那样使用,但应遵循以下规则: (1)不能将一个结构体变量作为一个整体进行输入和输出,而只能对结构体变量中的各个成 员分别进行输入和输出。 Struct date { Int month; Int day; Itn year; }day; Scanf(“%d%d%d”,day);(错误) Scanf(“%d%d%d”,&day.year,&day.month,&day.day);(正确) Printf(“%d%d%d”,day);(错误) Printf(“%d%d%d”,day.year,day.month,day.day);(正确) (2)如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一级一级地找到最底 的一级的成员,只能对最底级的成员进行赋值或存取运算。 Struct date { Int month; Int day; Int year; };
2.由指向结构体变量的指针变量引用结构体成员的形式为: (*指针变量).成员名 或指针变量名->成员名
->为指向运算符 如:上面示例用指针变量引用其成员的方式为: (*pstu).num , (*pstu).name (*pstu).sex , (*pstu).score
可以等价表示为: Pstu->num,pstu->name,pstu->sex,pstu->score
Char sex; Int age; Float score; }; Struct student stu1,stu2;
2.在定义结构体类型的同时定义变量 形式: Struct 结构体名 { 类型标识符 1 成员名 1; 类型标识符 2 成员名 2; …… 类型标识符 n 成员名 n; }变量名表; 例如: Struct student { Char name[20]; Char sex; Int age; Float score; }stu1,stu2;
3.用匿名形式直接定义结构体类型变量 形式: Struct { 类型标识符 1 成员名 1; 类型标识符 2 成员名 2; …… 类型标识符 n 成员名 n; }变量名表; 例如: Struct
{ Char naem[20]; Char sex; Int age; Float score; }stu1,stu2;
{101,”WGJ”,’M’,28,88.5,”CS”} {102,”DYH”,’F’,26,88.0,”CS”} {103,”DYC”,’M’,24,78.5,”CS”} };
11.3.3 结构体数组的使用 结构体数组成员的访问十一数组元素为结构体变量的,其形式为:结构体数组元素名.成员 名 如:stu[2].age
【例 11.1】候选人得票的统计。设有三个候选人,每次输入一个得票的候选人名字,要求最 后输出各人得票结果。
Struct person { Char name[20]; Int count; }leader[3]={“Zhang”,0,”Li”,0,”Wang”,0};
Main() { Int i,j; Char leader_name[20]; For(i=1;i<=10;i++){
(3)对结构体变量的成员可Байду номын сангаас像同类型普通变量一样进行各种运算。
11.2.3 结构体变量的初始化与存储 1.结构体变量的初始化:在定义结构体变量的同时给它赋以初值。 Struct student { Char name[20]; Char sex; Int age; Float score; }stu1,stu2={“wangwu”,’m’,20,88.5};
Scanf(“%s”,leader_name); For(j=0;j<3;j++)
If(strcmp(leader_name,leader[j].name)==0) Leader[j].count++; } Printf(“\n”); For(i=0;i<3;i++) Printf(“%5s:%d\n”,leader[i].name,leader[i].count); }
2.关于结构体类型的说明: (1)“struct 结构体名”是一个类型名,它和 int、float 等作用一样可以用来定义变量。 (2)结构体名是结构体的标识符不是变量名,也不是类型名。 (3)构成结构体的每一个类型变量称为结构体成员,它像数组的元素一样,单数组中元素以 下标来访问,而结构体是按结构体变量名来访问成员的。 (4)结构体中的各成员既可以属于不同的类型,也可以属于相同的类型。 (5)成员也可以是一个结构体类型,如:
加入要定义一个班级 100 个同学的学号、姓名、性别、年龄,可以定义成一个结构体数组。 如下所示: Struct{ Long num; Char name[20]; Char sex;
Int age; }stu[100]; 11.3.2 结构体数组的初始化 一般形式是在定义的数组后面加上={初始值表列}; Struct student { Long num; Char name[20]; Char sex; Int age; Float score; Char add[5]; }stu[3]={
并非所有成员变量的内存总和
事实上,所有数据类型在内存中都是从偶数地址开始存放的且结构所占的实际空间一般是按 照机器字长对齐的不同编译器、平台,对齐方式会有变化 结构体变量的成员存储对齐规则是与机器相关的 具有特定数据类型的数据项大小也是与机器相关的 所以一个结构体在内存中的存储格式也是与机器相关的
3.结构体变量存储分配示意图
注意: (1)如果 p 的初值为 stu,即指向第一个元素,则 p+1 后指向下一个元素。请区别:(++p)->num
和(p++)->num (2)指针 p 已定义为指向 struct student 类型的数据,它只能指向该结构体类型数据,而不能指 向一元素的某以成员(即 p 的地址不能是成员的地址)。如下面的赋值是错误的:p=&stu.num 编译时将给出“警告”信息,表示地址的类型不匹配。不要认为反正 p 是存放地址的,可以 将任何地址赋给它。
Struct student { Long num; Char naem[20]; Char sex; Int age; Struct date birthday; Char depart[10]; }stu1;
如:stu1.birthday.year=2004; Stu1.birthday.month=12;
结构体与链表
11.1 结构体类型的定义 结构体是由 C 语言中的基本数据类型构成的、并用一个标识符来命名的各种变量的组合, 其中可以使用不同的数据类型。
1.结构体类型的定义 Struct 结构体名 { 类型标识符 1 成员名 1; 类型标识符 2 成员名 2; …… 类型标识符 n 成员名 n; }; Struct 结构体名——结构体类型名
11.4 结构体类型指针 一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以定义一个指针变量,用 来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。 11.4.1 指向结构体变量的指针 1.指向一个结构体变量的指针定义形式:
Struct 结构体名 *指针变量名; 例如: Struct student { Long int num; Char name[20]; Char sex; Float score; }; Struct student *pstu,stu; Pstu=&stu;
11.3 结构体类型数组 11.3.1 结构体数组的定义与使用 结构体是一种新的数据类型,同样可以有结构体数组。 1、结构体数组的定义 结构体数组就是具有相同结构体类型的变量集合。 Struct 结构体名 { 类型标识符 1 成员名 1; 类型标识符 2 成员名 2; …… 类型标识符 n 成员名 n; }数组名[整型常量表达式];
{10101,”zhang”,’m’,18}, {10102,”li”,’m’,19}, {10103,”wang”,’f’,20} }; Main(){ Struct student *p; Printf(“No.Name sex age\n”); For(p=stu;p<stu+3;p++) Printf(“%5d%-20s%2c%4d\n”,p->num,p->name,p->sex,p->age); }
11.4.2 指向结构体数组元素的指针 一个指针变量可以指向一个结构体数组元素(将该结构体数组的数组元素地址赋给此指针变 量)。例如: Struct { Int a; Float b; }arr[3],*p; P=arr;
此时使 p 指向 arr 数组的第一个元素,“p=arr;”等价于“p=&arr[0];”。若执行“p++;”则此 时指针变量 p 此时指向 arr[1]。 例 11.3 输出数组中各元素中各成员的值。 Struct student { Int num; Char name[20]; Char sex; Int age; }; Struct student stu[3]={
Struct date { Int month; Int day; Int year; }; Struct person { Float num; Char name[20]; Char sex; Int age; Struct date birthday; Char address[10]; };
Printf(“\nNo.:%ld\nname:%s\nsex:%cscore:%f\n”,(*p).num,(*p).name,(*p).sex,(*p).score); Printf(“\nNo.:%ld\nname:%s\nsex:%c\nscore:%f\n”,p->num,p->name,p->sex,p->score); }
相关文档
最新文档