结构体
一、结构体的声明
1. 结构体是一种自定义的数据类型,可用于将不同类型的数据组合起来,这些不同类型的数据就是结构体成员
2. 结构体成员的类型可以是标量,数组,指针,甚至是其他结构体
定义结构体:
struct 结构体名{
数据类型 成员1;
数据类型 成员2;
......
};
创建结构体变量:
1. 通过结构体名直接创建变量
struct 结构体名 结构体变量名;
例:struct student s;
2. 定义结构体时创建变量
例:
struct Student{
int id;
char name[50];//结构体成员为字符数组时通常要指明其长度,便于分配固定内存,该长度明确了能存储的最大字符数
float score;
} student 1,student2;
初始化结构体变量:
初始化:定义变量的同时赋初值
例:
struct student student1={224658,"zhangsan",90};
二、结构体成员的访问
1. 通过结构体变量,运用 “ . ” 操作符来访问结构体成员
例:
printf("学生1的分数是%d\n",student1.score);
2. 通过结构体指针,运用 “→” 操作符来访问结构体成员
例:
void test(struct student* p)
{
printf("%d\n", (*p).id);
printf("%s\n", p→name);
}
三、结构体传参
请看代码:
#include <stdio.h>
struct S {
int data[1000];
int num;
};
void print1(struct S s)//函数参数为结构体变量
{
printf("%d\n", s.num);
}
void print2(struct S* ps)//函数参数为结构体指针
{
printf("%d\n", ps->num);
}
int main()
{
struct S s = { {1,2,3,4},1000 };
print1(s);//结构体变量传参
print2(&s);//结构体地址传参
return 0;
}
显然,print2函数更好一些
原因:结构体传参时是需要压栈的,传递结构体变量时,结构体越大,系统压栈的开销越大,性能会下降,因此结构体传参时尽量传递其地址