1.结构体
在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。 它相当于其它高级语言中的记录。“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。
2.定义和使用结构体变量
声明一个结构体类型的一般形式为:
Struct 结构体名
{成员列表};
花括号里是该结构体所以包含的子项,称为结构体的成员,对各成员都应进行类型声明。即
类型名 成员名;
定义一个结构的一般形式为:
struct 结构名
{成员表列};
成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。
成员名的命名应符合标识符的书写规定。例如:
struct Student
{
int num;
char name[20];
char sex;
float score;
};
在这个结构定义中,结构名为stu,该结构由4个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应注意在括号后的分号是不可少的。结构定义之后,即可进行变量说明。凡说明为结构Student的变量都由上述4个成员组成。由此可见,结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。
定义结构体类型变量
1.先声明结构体类型,再定义该类型的变量。
例如,
struct Student student 1 ,student 2;
这种形式和定义其他类型的变量形式是相似的。在定义了结构体变量之后磨系统会为之分配内存单元。
2.在声明类型的同时定义变量。
例如,
struct Student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}
它的作用与第一种方法相同,但是在定义structStudent 类型的同时定义两个struct Student 类型的变量。这种定义方法的一般形式为
struct 结构体名
{
成员列表
}变量名列表;
3.不指定类型名而直接定义结构体类型变量,其一般形式为
struct
{
成员列表
}变量名列表;
指定了一个无名的结构体类型。
1. 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)
2.定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束)
// 从这行开始,一直到文件结尾,都是有效(跟全局变量一样)
struct Date
{
int year;
int month;
int day;
};
int a;
void test2()
{
struct Date
{
int year;
};
// 这里使用的是test2函数内部的struct Date类型
struct Date d1 = {2011};
// 结构体类型也是有作用域,从定义类型的那一行开始,一直到代码块结束
struct Person
{
int age;
};
struct Person p;
a = 10;
}
int main()
{
struct Date d1 = {2009, 8, 9};
test2();
// 不能使用test2函数中定义的类型
// struct Person p2;
return 0;
}
// 定义结构体变量
void test()
{
// 定义结构体变量的第3种方式
struct {
int age;
char *name;
} stu;
struct {
int age;
char *name;
} stu2;
3.结构体变量的初始化和引用
在定义结构体变量时,可以对它初始化。例如,
#include <stdio.h>
int main()
{
struct Student
{
long int num;
char name[20];
int age;
char sex;
}
a= {10101,”liiming”,10,’M’};
printf(“num:%ld,name:%s,age:%d,sex:%c”,a.num,a.name,a.age,a.sex);
return 0;
注意;
1.在定义结构体变量是可以对他的成员初始化。
2.可以引用结构体变量中成员的值。
3.如果成员本身又属于一个结构体类型,则要用若干个成员运算符。只能对最低级的成员进行赋值或存取以及计算。
4.对结构体变量的成员可以像普通变量一样进行运算。
5.同类的结构体变量可以相互赋值。
6.可以引用结构体变量成员的地址,也可以引用结构体变量的地址。
4.指向结构体的指针
struct Student *p;
2.利用指针访问结构体的成员
1> (*p).成员名称
2> p->成员名称
#include <stdio.h>
int main()
{
struct Student
{
int no;
int age;
};
// 结构体变量
struct Student stu = {1, 20};
// 指针变量p将来指向struct Student类型的数据
struct Student *p;
// 指针变量p指向了stu变量
p = &stu;
p->age = 30;
// 第一种方式
printf("age=%d, no=%d\n", stu.age, stu.no);
// 第二种方式
printf("age=%d, no=%d\n", (*p).age, (*p).no);
// 第三种方式
printf("age=%d, no=%d\n", p->age, p->no);
return 0;
}