只要你愿意 开始总比放弃好。 Roman.
愿我们都有自己的目标并正在为其不懈努力。
-----------------------------------------------------------------------
一、结构体的声明
一)结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
二)结构体的声明
形如:
struct tag // struct(关键字)+ 结构体标签
{
member-list; //成员变量
}variable-list; //变量列表
例:
//结构体
struct Stu
{
char name[20]; //名字
int age; //年龄
char sex[8]; //性别
float score; //成绩
}s1,s2,s3;
// s1,s2,s3 是通过 struct Stu 类型创建的变量
// s1,s2,s3 是全局变量// typedef 类型重定义/ 类型重命名
typedef struct Stu Stu;
// 此时可以用 Stu 代替 struct Stuint main()
{
// struct Stu 是结构体类型,不能随便省略 struct
struct Stu s4;
struct Stu s5;
// s4,s5 是局部变量
Stu s6;
// typedef 后可以使用 Stureturn 0;
}
// typedef 另一种方式struct Stu
{
char name[20]; //名字
int age; //年龄
char sex[8]; //性别
float score; //成绩
}Stu; // 此时此处只能写重命的名,不能写变量列表
三)结构体成员的类型
结构体成员可以是 标量、数组、指针,甚至是结构体。
四)结构体变量的定义和初始化
1. 结构体初始化用 大括号{ }
2. 指针变量 放地址 or 放空指针NULL
------------------------------------------------------------------------------
二、结构体成员的访问
1. 结构成员访问操作符:
- 结构体变量 . 结构体成员名
- 结构体指针 -> 结构体成员名
2. 实例:
// 结构体访问
struct Stu
{
char name[20];
int age;
};
void print(struct Stu* ps) {
printf("name = %s age = %d\n", (*ps).name, (*ps).age);
//使用结构体指针访问指向对象的成员
printf("name = %s age = %d\n", ps->name, ps->age);
}
int main()
{
struct Stu s = { "zhangsan", 20 };
print(&s);//结构体地址传参
return 0;
}
// 如果结构体有多层 则按照 指针-> or 变量. 进行访问即可
3. 修改 结构体变量的成员内容
- 成员普通: =(赋值)
- 成员是数组: strcpy( ,); // 头文件 string.h
------------------------------------------------------------------------------
三、结构体传参
一)传 结构体变量
传 结构体变量,即 值传递: 实参是形参的一份临时拷贝。
- 会浪费较大的空间
- 通过函数改变形参内容时,实参不会改变,安全性较高
二)传 结构体指针
传 结构体指针,即 址传递。
- 只占 4/8 字节,空间较小
- 为提高安全性,可在传参时形参前加上 const 修饰
三)小结
函数传参时,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销较大,所以会导致性能下降
- 每一次函数调用都要在内存的栈区开辟一块空间
- 内存(从上到下):
栈区:局部变量、函数参数
堆区:动态内存开辟 如:malloc 、free 、calloc 、realloc
静态区:静态变量、全局变量
- 小结: 结构体传参,要传 结构体地址
------------------------一个人所有的愤怒都来源于对自己无能的痛苦。------------------------