头文件:
#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;
}