目录
自定义类型-结构体
假设我们要存储一个学生的身份信息,包括学号,姓名 ... 等 此时我们可以自己定义一种类型,来封装这些信息,那么此时我们就可以运用到结构体
结构体类型
结构体是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量
结构的成员可以是变量、数组、指针、也可以是其它结构体!
在C语言中用 stucrt 来定义结构体类型
#include <stdio.h>
// 定义结构体类型
struct STU{
int avg;
char name[10];
float hight;
double wight;
};
int main()
{
return 0;
}
结构体变量的定义和初始化
我们知道 整型类型 定义变量: int a=0;
浮点型 定义变量:float b=0.0;
指针变量 :int* p=NULL;
以此类推结构体也是一种类型,它也可以定义变量,变量可以初始化!
具体看代码:
#include <stdio.h>
//创建结构体类型
struct STU {
char name[10];
int age;
float hight;
double wight;
}S1 = { "李真人",289,1.78f,186 };
// 直接在创建类型的时候创建结构体变量 S1,并初始化;
struct STU S2 = { "万孔林",18,1.60f,125 };//定义结构体全局变量 S2;
int main()
{
struct STU S3 = { "悬手低涂",988,1.88f,149 };//定义结构体局部变量S3并初始化!
struct STU * p = NULL; //结构体指针的定义
p = &S1; // 让结构体指针指向结构体变量S1
return 0;
}
结构体成员的访问
结构体变量的访问有两种访问方式
第一种是 . 操作符访问:结构体变量.成员变量名
第二种是 -> 操作符访问:指针的访问形式:指针->成员变量
#include <stdio.h>
//定义结构体类型
struct STU {
char name[10];
int age;
float hight;
double wight;
};
int main()
{
//定义结构体变量
struct STU S = { "雷古",58,1.78f,145 };
//用 点 . 操作符访问成员
printf("%s %d %f %lf\n", S.name, S.age, S.hight, S.wight);
// 定义结构体指针
struct STU * p = &S;
//用 -> 操作符访问成员
printf("%s %d %f %lf\n", p->name, p->age, p->hight, p->wight);
//以指针解引用的方式访问成员
printf("%s %d %f %lf\n", (*p).name, (*p).age, (*p).hight, (*p).wight);
return 0;
}
结构体传参
结构体在函数传参的时候,有两种方式:
1、传值:直接传结构体
2、传地址:传结构体指针
结构体在传参的时候建议传结构体的地址
原因:
函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的 下降。
#include <stdio.h>
struct stu {
char namr[10];
int age;
float hight;
double wight;
};
void Prin(struct stu s)
{
// 结构体变量 . 成员变量 访问
printf("%s %d %f %lf\n", s.namr, s.age, s.hight, s.wight);
}
void dayin(struct stu* p)
{
// 指针->成员变量访问
printf("%s %d %f %lf\n", p->namr, p->age, p->hight, p->wight);
// 指针解引用 . 成员变量访问
printf("%s %d %f %lf\n", (*p).namr, (*p).age, (*p).hight, (*p).wight);
}
int main()
{
struct stu s = { "大帝蟒",28,1.79f,189 };
struct stu* p = &s;
Prin(s);//传值,传结构体
dayin(p);// 传址,传结构体指针
return 0;
}