一、什么是结构体
结构体(struct)是由一系列具有相同或不同类型的数据构成的数据集合,是一种特殊的数据类型。区别与数组的是,数组内部是相同类型的数据。
二、如何使用结构体
#include<stdio.h>
//定义一种数据类型
struct Student
{
int sid;
char name[200];
int age;
}; //分号不能省
int main(void)
{
struct Student st = {1000, "zhangsan", 20};// 定义结构体变量的同时初始化
st.sid = 99; //第一种方式
//st.name = "lisi"; //error
strcpy(st.name, "lisi");//只能使用strcpy函数为字符数组整体赋值
struct Student * pst;
pst = &st;
pst->sid = 99; //第二种方式 pst->sid 等价于 (*pst).sid 而(*pst).sid等价于 st.sid, 所以pst->sid 等价于 st.sid
return 0;
}
访问结构体成员内部变量有两种方式:
- 通过结构体指针:结构体指针变量名->成员
- 通过结构体名:结构体.成员
也可以使用typedef关键字重命名结构体:
typedef struct teacher
{
char name[20];
int age;
int mager;
}teacher_t
teacher_t teacher;
三、 结构体变量的运算
相同结构体的不同变量只保留了赋值运算符
st1 = st2
四、 结构体变量作为函数的形参与结构体指针作为函数的形参
(1)结构体变量作为函数形参的时候,实际上和普通变量(类似于int之类的)传参时表现是一模一样的。所以说结构体变量其实也是普通变量而已。
(2)因为结构体一般都很大,所以如果直接用结构体变量进行传参,那么函数调用效率就会很低。(因为在函数传参的时候需要将实参赋值给形参,所以当传参的变量越大调用效率就会越低)。怎么解决?思路只有一个那就是不要传变量了,改传变量的指针(地址)进去。
# include <stdio.h>
# include <string.h>
struct Student
{
int sid;
char name[200];
int age;
}; //分号不能省
void f(struct Student * pst);
void g(struct Student st);
void g2(struct Student *pst);
int main(void)
{
struct Student st; //已经为st分配好了内存
f(&st);
g2(&st);
//printf("%d %s %d\n", st.sid, st.name, st.age);
return 0;
}
//这种方式耗内存 耗时间 不推荐
void g(struct Student st)
{
printf("%d %s %d\n", st.sid, st.name, st.age);
}
void g2(struct Student *pst)
{
printf("%d %s %d\n", pst->sid, pst->name, pst->age);
}
void f(struct Student * pst)
{
(*pst).sid = 99;
strcpy(pst->name, "zhangsan");
pst->age = 22;
}