结构体的介绍
在C语言中,结构体是一种用户自定义的数据类型,它允许开发者将不同类型的变量组合在一起,形成一个新的数据类型。结构体可以包含多个成员变量,每个成员可以是不同的数据类型,例如整型、字符型、浮点型等。
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构体定义
结构体的定义使用关键字struct
,后面跟随结构体的名称。
例如描述一个人:
代码语言:javascript复制struct Person {
char name[20];
int age;
float height;
};
上述代码定义了一个名为Person的结构体,它包含三个成员变量:name、age和height。name是一个字符型数组,有20个元素;age是一个整型变量;height是一个浮点型变量。
结构成员的类型
结构成员的类型可以是以下几种:
- 基本数据类型:包括整型(int)、浮点型(float)、字符型(char)、布尔型(bool)等。
- 枚举类型:表示一组具有离散值的变量。
- 结构体类型:用来定义多个不同类型的变量,形成一个新的数据类型。结构体中可以包含基本数据类型、枚举类型、数组、指针等。
- 指针类型:表示变量的地址。
- 数组类型:表示一组相同类型的变量。
- 函数类型:表示函数的参数和返回值类型。
这些类型可以在结构体中作为成员类型,用于定义结构体的成员变量。
结构体变量的定义和初始化
结构体变量定义有两种方式,一种在声明时候直接定义,一种在使用时再定义:
代码语言:javascript复制struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
//需要使用时
struct Point p2; //定义结构体变量p2
定义变量的同时初始化:
代码语言:javascript复制struct Point p3 = {1, 2};//定义结构体变量p3并赋值1和2
结构体嵌套初始化:
代码语言:javascript复制struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
结构体成员的访问
- 通过点操作符(.)访问结构变量的成员:
点操作符接受两个操作数。
例如:
代码语言:javascript复制struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = { "tutu",20};
printf("%s,%d", s.name, s.age);//使用.访问s中的成员
- 结构体指针访问指向变量的成员:
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = { "tutu",20};
struct Stu* ps = &s;
printf("%s,%d", ps->name, ps->age);//使用->访问ps指向的结构体成员
结构体传参
结构体传参可以通过以下两种方式:
- 传值传参
代码语言:javascript复制将结构体的副本传递给函数。
//结构体传值传参
void print1(struct Stu s)
{
printf("%dn", s.age);
}
struct Stu s = { "tutu",20};
print1(s);
- 传地址传参
代码语言:javascript复制将结构体的指针传递给函数,以便在函数内部修改结构体的内容。
//结构体地址传参
void print2(struct S* ps)
{
printf("%dn", ps->num);
}
struct Stu s = { "tutu",20};
print2(&s);
结构体传参的时候,要传结构体的地址。
这是因为函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。此外,传递结构体地址也便于我们修改结构体的内容。