C语⾔结构体⽤法
结构体(struct)
结构体是由基本数据类型构成的、并⽤⼀个标识符来命名的各种变量的组合。结构体中可以使⽤不同的数据类型。
1. 结构体说明和结构体变量定义
在Turbo C中, 结构体也是⼀种数据类型, 可以使⽤结构体变量, 因此, 像其它类型的变量⼀样, 在使⽤结构体变量时要先对其定义。
定义结构体变量的⼀般格式为:
struct结构体名
{
类型变量名;
类型变量名;
...
} 结构体变量;
结构体名是结构体的标识符不是变量名。
构成结构体的每⼀个类型变量称为结构体成员, 它象数组的元素⼀样, 但数组中元素是以下标来访问的, ⽽结构体是按变量名字来访问成员的。
下⾯举⼀个例⼦来说明怎样定义结构体变量。
struct string
{
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
} person;
这个例⼦定义了⼀个结构体名为string的结构体变量person, 如果省略变量名 person, 则变成对结构体的说明。⽤已说明的结构体名也可定义结构体变量。这样定义时上例变成:
struct string
{
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
};
struct string person;
如果需要定义多个具有相同形式的结构体变量时⽤这种⽅法⽐较⽅便, 它先作结构体说明, 再⽤结构体名来定义变量。
例如:
struct string Tianyr, Liuqi, ...;
如果省略结构体名, 则称之为⽆名结构体, 这种情况常常出现在函数内部, ⽤这种结构体时前⾯的例⼦变成:
struct
{
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
} Tianyr, Liuqi;
2. 结构体变量的使⽤
结构体是⼀个新的数据类型, 因此结构体变量也可以象其它类型的变量⼀样赋值、运算, 不同的是结构体变量以成员作为基本变量。
结构体成员的表⽰⽅式为:
结构体变量.成员名
如果将"结构体变量.成员名"看成⼀个整体, 则这个整体的数据类型与结构体中该成员的数据类型相同, 这样就可象前⾯所讲的变量那样使⽤。
下⾯这个例⼦定义了⼀个结构体变量, 其中每个成员都从键盘接收数据, 然后对结构体中的浮点数求和, 并显⽰运算结果, 同时将数据以⽂本⽅式存⼊⼀个名为wage.dat的磁盘⽂件中。请注意这个例⼦中不同结构体成员的访问。
例1:
#include <stdio.h>
void main()
{
struct/*定义⼀个结构体变量*/
{
char name[8];
int age;
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
}a;
FILE *fp;
float wage;
char c=’Y’;
fp="fopen"("wage.dat", "w");
/*创建⼀个⽂件只写*/
while(c==’Y’||c==’y’) /*判断是否继续循环*/
{
printf("/nName:");
scanf("%s", a.name); /*输⼊姓名*/
printf("Age:");
scanf("%d", &a.wage); /*输⼊年龄*/
printf("Sex:");
scanf("%d", a.sex);
printf("Dept:");
scanf("%s", a.depart);
printf("Wage1:");
scanf("%f", &a.wage1); /*输⼊⼯资*/
printf("Wage2:");
scanf("%f", &a.wage2);
printf("Wage3:");
scanf("%f", &a.wage3);
printf("Wage4:");
scanf("%f", &a.wage4);
printf("Wage5:");
scanf("%f", &a.wage5);
wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5;
printf("The sum of wage is %6.2f/n", wage); /*显⽰结果*/
fprintf(fp, "%10s%4d%4s%30s%10.2f/n", a.name, a.age, a.sex, a.depart, wage); /*结果写⼊⽂件*/
while(1)
{
printf("Continue?<Y/N>");
c="getche"();
if(c==’Y’||c==’y’||c==’N’||c==’n’)
break;
}
}
fclose(fp);
}
3. 结构体数组和结构体指针
结构体是⼀种新的数据类型, 同样可以有结构体数组和结构体指针。
(1) 结构体数组
结构体数组就是具有相同结构体类型的变量集合。假如要定义⼀个班级40个同学的姓名、性别、年龄和住址, 可以定义成⼀个结构体数组。如下所⽰: struc
{
char name[8];
char sex[2];
int age;
char addr[40];
}student[40];
也可定义为:
struct string
{
char name[8];
char sex[2];
int age;
char addr[40];
};
struct string student[40];
需要指出的是结构体数组成员的访问是以数组元素为结构体变量的, 其形式为:
结构体数组元素.成员名
例如:
student[0].name
student[30].age
实际上结构体数组相当于⼀个⼆维构造, 第⼀维是结构体数组元素, 每个元素是⼀个结构体变量, 第⼆维是结构体成员。
注意:
结构体数组的成员也可以是数组变量。
例如:
struct a
{
int m[3][5];
float f;
char s[20];
}y[4];
为了访问结构体a中结构体变量y[2]的这个变量, 可写成
y[2].m[1][4]
(2) 结构体指针
结构体指针是指向结构体的指针。它由⼀个加在结构体变量名前的"*" 操作符来定义, 例如⽤前⾯已说明的结构体定义⼀个结构体指针如下:
struct string{
char name[8];
char sex[2];
int age;
char addr[40];
}*student;
也可省略结构体指针名只作结构体说明, 然后再⽤下⾯的语句定义结构体指针。
struct string *student;
使⽤结构体指针对结构体成员的访问, 与结构体变量对结构体成员的访问在表达⽅式上有所不同。结构体指针对结构体成员的访问表⽰为:
结构体指针名->结构体成员
其中"->"是两个符号"-"和">"的组合, 好象⼀个箭头指向结构体成员。例如要给上⾯定义的结构体中name和age赋值, 可以⽤下⾯语句:
strcpy(student->name, "Lu G.C");
student->age=18;
实际上, student->name就是(*student).name的缩写形式。
需要指出的是结构体指针是指向结构体的⼀个指针, 即结构体中第⼀个成员的⾸地址, 因此在使⽤之前应该对结构体指针初始化, 即分配整个结构体长度的字节空间, 这可⽤下⾯函数完成, 仍以上例来说明如下:
student=(struct string*)malloc(size of (struct string));
size of (struct string)⾃动求取string结构体的字节长度,
malloc() 函数
定义了⼀个⼤⼩为结构体长度的内存区域, 然后将其诈地址作为结构体指针返回。
注意:
a. 结构体作为⼀种数据类型, 因此定义的结构体变量或结构体指针变量同样有局部变量和全程变量, 视定义的位置⽽定。
b. 结构体变量名不是指向该结构体的地址, 这与数组名的含义不同, 因此若需要求结构体中第⼀个成员的⾸地址应该是&[结构体变量名]。
4. 结构体的复杂形式
(1) 嵌套结构体
嵌套结构体是指在⼀个结构体成员中可以包括其它⼀个结构体, Turbo C 允许这种嵌套。
例如: 下⾯是⼀个有嵌套的结构体
struct string{
c++中string的用法char name[8];
int age;
struct addr address;
} student;
其中: addr为另⼀个结构体的结构体名, 必须要先进⾏, 说明, 即
struct addr{
char city[20];
unsigned lon zipcode;
char tel[14];
}
如果要给student结构体中成员address结构体中的zipcode赋值, 则可写成:
student.address.zipcode=200001;
每个结构体成员名从最外层直到最内层逐个被列出, 即嵌套式结构体成员的表达⽅式是:
结构体变量名.嵌套结构体变量名.结构体成员名
其中: 嵌套结构体可以有很多, 结构体成员名为最内层结构体中不是结构体的成员名。
(2) 位结构体
位结构体是⼀种特殊的结构体, 在需按位访问⼀个字节或字的多个位时, 位结构体⽐按位运算符更加⽅便。
位结构体定义的⼀般形式为:
struct位结构体名{
数据类型变量名: 整型常数;
数据类型变量名: 整型常数;
} 位结构体变量;
其中: 数据类型必须是int(unsigned或signed)。整型常数必须是⾮负的整数, 范围是0~15, 表⽰⼆进制位的个数, 即表⽰有多少位。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下⾯定义了⼀个位结构体。
struct{
unsigned incon: 8;
/*incon占⽤低字节的0~7共8位*/
unsigned txcolor:
4;/*txcolor占⽤⾼字节的0~3位共4位*/
unsigned bgcolor:
3;/*bgcolor占⽤⾼字节的4~6位共3位*/
unsigned blink: 1; /*blink占⽤⾼字节的第7位*/
}ch;
位结构体成员的访问与结构体成员的访问相同。
例如: 访问上例位结构体中的bgcolor成员可写成:
ch.bgcolor
注意:
a. 位结构体中的成员可以定义为unsigned, 也可定义为signed, 但当成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
b. 位结构体中的成员不能使⽤数组和指针, 但位结构体变量可以是数组和指针,如果是指针, 其成员访问⽅式同结构体指针。
c. 位结构体总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字节。
d. 位结构体成员可以与其它结构体成员⼀起使⽤。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay: 1;
}workers;
上例的结构体定义了关于⼀个⼯从的信息。其中有两个位结构体成员, 每个位结构成员只有⼀位, 因此只占⼀个字节但保存了两个信息, 该字节中第⼀位表⽰⼯⼈的状态, 第⼆位表⽰⼯资是否已发放。由此可见使⽤位结构体可以节省存贮空间。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论