结构体类型的定义与使用
在C语言中,结构体就是由不同类型的变量组成的自定义数据类型。结构体变量是由结构体类型定义的变量,可以同时存储不同类型的数据。下面是一个结构体类型的定义:
struct student
{
int id;
char name[20];
int age;
char gender;
}
这里我们定义了一个名为student的结构体类型,包含id、name、age和gender四个成员变量。结构体类型的各个成员之间没有空格,中间用分号隔开。其中,id是一个整型变量,name是一个字符数组,age也是一个整型变量,gender是一个字符变量。
我们可以使用这个类型定义一个结构体变量,如下所示:
struct student stu1, stu2;
这里定义了两个结构体变量,名为stu1和stu2,它们都属于student类型。
结构体变量的访问方式
我们可以像普通变量一样访问结构体变量中的各个成员,使用"."运算符即可。例如:
struct student stu1;
stu1.id = 1001;
strcpy(stu1.name, "Tom");
stu1.age = 18;
stu1.gender = 'M';
这里我们先定义了一个名为stu1的结构体变量,然后分别给它的成员变量赋值。其中,给name赋值时使用了标准库函数strcpy,这个函数可以将一个字符串赋值给字符数组类型的变量。如果没有引入string.h头文件,则会在编译的时候报错。
结构体变量作为函数参数传递
除了作为普通变量使用,结构体变量还可以作为函数的参数进行传递。在函数中对结构体变量的修改会直接影响到实参的值。例如:
struct student modify(struct student stu)
{
stu.age += 1;
return stu;
}
int main()
{
struct student stu1;
stu1.id = 1001;
strcpy(stu1.name, "Tom");
stu1.age = 18;
stu1.gender = 'M';
struct student stu2 = modify(stu1);
printf("%d %s %d %c\n", stu2.id, stu2.name, stu2.age, stu2.gender);
return 0;
}
这里我们定义了一个modify函数,它接收一个名为stu的结构体变量作为参数,并且返回一个同样类型的结构体变量。我们在函数中将参数stu的age成员变量加1,然后返回它。在main函数中,我们先定义了一个stu1结构体变量,并且给它的各个成员变量赋值。接着将stu1作为参数传给modify函数,并且将函数的返回值赋给了stu2。我们使用printf函数输出了stu2中的各个成员变量,可以看到age的值由18变成了19。
结构体指针及其访问方式
除了使用结构体变量表示结构体,我们还可以使用指向结构体的指针来表示结构体。结构体指针的访问方式可以使用"->"运算符。例如:
struct student *p;
p = &stu1;
p->id = 1001;
strcpy(p->name, "Tom");
p->age = 18;
p->gender = 'M';
这里我们定义了一个指向struct student类型的指针p,并将它赋值为stu1的地址。然后使用"->"运算符给它的成员变量id、name、age、gender赋值。这种方式下,用"->"取代了使用"."的访问方式。
结构体嵌套
结构体还可以相互嵌套,定义为一个更为复杂的数据类型,例如:
struct teacher
{
int id;
char name[20];
int age;
char gender;
struct student stu;
};
这里我们定义了一个teacher的结构体类型,并且将它的stu成员变量定义为一个student类型的变量。这样,我们定义的teacher类型就包含了一个student类型的变量。在实际应用中,这种嵌套结构体的方式可以更好地适应复杂的数据结构。
小结
在C语言中,结构体变量是由自定义类型的结构体定义的变量。结构体类型定义时由多个成员变量组成,可以是不同类型的变量,成员之间使用分号分割。结构体变量可以直接使用"."运算符访问各个成员变量。结构体变量可以作为函数参数传递,也可以声明指向结构体的指针,使用"->"访问其成员变量。结构体可以相互嵌套,达到复杂数据结构的目的。