头文件:
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdlib.h> #include <time.h> #include <string.h>//字符串拷贝 #include <stdio.h> #include <limits.h> #include <ctype.h> #include <math.h>
结构的声明
结构是一些值的集合,这些值称为成员变量。结构的每一个成员可以是不同类型的变量
数组:一组相同类型元素的集合 结构体:可以表示含有多个元素的复杂变量
struct tag //tag:类型名字
{
member - list; 成员变量的列表 可以是多个
}; variable - list;变量列表
结构体可以表示含有多个元素的复杂变量
当前学习过的类型都是内置类型 一些复杂类型需要用结构体表述
member_list就可以表述结构体对象多个属性
描述一个学生 结构体创建方式 1.
struct stu//tag名字根据实际情况命名 { //描述学生的相关属性 char name[20]; int age; char sex[5]; char tel[12];//电话需要用字符串描述 }s3,s4;//结构体类型的变量 全局变量 int main() { struct stu s1;//要留下struct 也是结构体变量 是局部变量 struct stu s2; //s1 s2是结构体类型的变量 局部变量 return 0; }
描述一个学生 结构体创建方式 2.
typedef struct stu { //描述学生的相关属性 char name[20]; int age; char sex[5]; char tel[12]; }stu;//stu是重命名产生的新的类型 int main() { stu s5;//使用typedef类型 //有了typedef可以省略struct,没有typedef不能省略struct return 0; }
结构的成员可以是标量、数组、指针、甚至是其他结构体、
结构体的初始化
struct B { char c; int i; }; struct S { char c; int num; int arr[10]; double* pd; struct B sb;//其他结构体类型的变量 struct B* pb;//结构体的指针pb }s1;//全局变量 利用结构体创建结构体变量 struct S s2;//S2是全局变量 利用结构体创建结构体变量 int main() { double d = 3.14; //按照顺序初始化 结构体的初始化也使用大括号 struct S s3 = { 'q',100,{1,2,3},&d,{'a',99},NULL };//结构体成员初始化 s3是局部变量 //指定成员初始化 struct S s4 = { .num = 1000, .arr = {1,2,3,4,5} };//局部变量 return 0; }
结构体成员的访问
结构体传参不涉及值的修改可以传参,结构体传参尽量传结构体的地址过去
函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大,
参数压栈的系统开销比较大,所以会导致性能下降
结论:结构体传参传地址
eg、创建一个学生信息结构体,并打印学生信息,涉及到结构体传参,
struct S { char name[20]; int age; }; void set_s(struct S *t)//形参是实参的一份临时拷贝 { (*t).age = 18; //t.name = "zhangsan";//错误,因为name是数组名,数组是常量的地址 strcpy(t->name, "zhangsan");//字符串你拷贝 } void print_s(struct S *t) { printf("%s %d\n", t->name, t->age); } int main() { struct S s = { 0 }; //写一个函数给s中存放数据 set_s(&s);//实参传递给形参 //修改s的值,数据进行更改 //写一个函数打印s中的数据 print_s(&s); return 0; }