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