天天看点

C语言学习笔记(8)结构体结构体的声明结构体变量的定义和初始化结构体成员的访问结构体传参

结构体

  • 结构体的声明
  • 结构体变量的定义和初始化
  • 结构体成员的访问
  • 结构体传参

结构体的声明

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;
}
           
C语言学习笔记(8)结构体结构体的声明结构体变量的定义和初始化结构体成员的访问结构体传参

结构体传参

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;
}
           
C语言学习笔记(8)结构体结构体的声明结构体变量的定义和初始化结构体成员的访问结构体传参

上面的print1和print2函数哪个好一些?

答案是:首选print2函数,原因如下

print1函数是传值,需要将要传的结构体重新拷贝一份再运行,会造成时间和空间上的浪费。print2函数是传值,只是把该结构体的地址传过去,而地址只需4个或8个字节,节省大量的时间和空间。(函数传参时,参数是需要压栈的,当结构体过大时,参数压栈的开销比较大,会导致性能下降。)

print2也有缺陷,我们可以通过print2函数传的地址修改原结构体的内容,安全性相对较差一些。但是我们可以通过关键字const防止原结构体被修改。

继续阅读