C语言学习笔记结构体
Posted 小倪同学 -_-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言学习笔记结构体相关的知识,希望对你有一定的参考价值。
结构体的声明
1.结构体的基础知识
结构是一些值的集合 , 这些值称为成员变量。结构的每个成员可以是不同类型的变量。
2.结构的声明
struct tag
{
member - list
}variab1e - 1ist;
例如描述一个学生
typedef struct Stu
{
char name[20];//名字
int age;//年齢
char sex[5];//性別
char id[20];//学号
}Stu; // 注意分号不能丢
3.结构体成员类型
结构的成员可以是标量、数组、指针,甚至是其他结构体。
结构体变量的定义和初始化
定义
struct Point
{
int x;
int y;
}p1;
struct Point p2;
定义结构体变量盘p1,p2。
初始化
struct Point
{
int x;
int y;
};
struct Point p = { 1, 2 };
struct Stu
{
char name[15];
int age;
}a = { "hehe", 18 };
struct Stu s = { "zhangsan", 20 };
struct Node
{
int data;
struct Stu p;
struct Node* next;
}n1 = { 513, { "lisi", 22 }, NULL };//结构体嵌套初始化
struct Node n2 = { 512, { "wangwu", 24 }, NULL };
结构体成员的访问
结构体变量成员是通过操作符( . )访问。
结构体指针访问成员用->
struct B
{
char c;
short s;
double d;
};
struct Stu
{
//成员变量
struct B b;
char name[20];//名字
int age;//年龄
char id[20];
};
int main()
{
//s是局部变量
struct Stu s = { {'w', 20, 3.14}, "张三", 30, "202005034"};//对象
printf("%c\\n", s.b.c);
printf("%s\\n", s.id);
struct Stu* ps = &s;
printf("%c\\n", (*ps).b.c);
printf("%d\\n", (*ps).b.s);
printf("%lf\\n", ps->b.d);
return 0;
}
结构体传参
struct B
{
char c;
short s;
double d;
};
struct Stu
{
//成员变量
struct B b;
char name[20];//名字
int age;//年龄
char id[20];
};
//结构体传参
void print1(struct Stu t)
{
printf("%c %d %lf %s %d %s\\n", t.b.c, t.b.s, t.b.d, t.name, t.age, t.id);
}
//结构体地址传参
void print2(struct Stu* ps)
{
printf("%c %d %lf %s %d %s\\n", ps->b.c, ps->b.s, ps->b.d, ps->name, ps->age, ps->id);
}
int main()
{
//s是局部变量
struct Stu s = { {'w', 20, 3.14}, "张三", 30, "202005034" };//对象
//写一个函数打印s的内容
print1(s);//传结构体
print2(&s);//传地址
return 0;
}
上面的print1和print2函数哪个好一些?
答案是:首选print2函数,原因如下
print1函数是传值,需要将要传的结构体重新拷贝一份再运行,会造成时间和空间上的浪费。print2函数是传值,只是把该结构体的地址传过去,而地址只需4个或8个字节,节省大量的时间和空间。(函数传参时,参数是需要压栈的,当结构体过大时,参数压栈的开销比较大,会导致性能下降。)
print2也有缺陷,我们可以通过print2函数传的地址修改原结构体的内容,安全性相对较差一些。但是我们可以通过关键字const防止原结构体被修改。
以上是关于C语言学习笔记结构体的主要内容,如果未能解决你的问题,请参考以下文章