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语言学习笔记结构体的主要内容,如果未能解决你的问题,请参考以下文章

C语言-结构体笔记1

C语言-结构体笔记1

在C代码中将结构体变量作为参数传递效率忒低

C语言-结构体笔记1

C语言学习笔记(15)自定义类型:结构体,枚举,联合

C语言进阶学习笔记四自定义类型详解之结构体