结构体(初阶)

88 阅读4分钟

结构体

  • 结构体类型的声明
  • 结构体初始化
  • 结构体成员访问
  • 结构体传参

1.结构体的声明

(1) 结构体的基础知识

结构是一些值的集合,这些值被称为成员变量。结构体的每个成员是不同类型的变量。

描述复杂对象会用到结构体,eg:

人:人名+电话+性别+身高…

书:书名+作者+编号+价格+…

会用到不同的类型

(2)结构的声明

struct tag//tag是结构体的类型名,是可以改的
{
    member-list;//成员列表,成员变量
}variable-list;

例如:

//声明的结构体类型
struct peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int high;
};

//示例1
struct peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int high;
}p1,p2;
//p1 p2是两个全局的结构体变量

//示例2
struct peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int high;
};
int main()
{
	struct peo p1;//结构体变量的创建
    //p1是局部的结构体变量
}

结构体类型就是个类型不占用空间,只有当结构体变量创建时,这个变量才向内存申请空间

(3)结构成员类型

结构的成员可以是标量、数组、指针,甚至是其他结构体。

//例如
struct peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int high;
};
struct stu
{
	struct peo p;
	int num;
	float f;
};

(4) 结构体变量的定义和初始化

有了类型,怎么定义变量呢?

//创建结构体变量
struct peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int high;
}p3,p4; //声明的同时定义变量p3 p4

struct peo p5, p6; //定义结构体变量p5 p6

int main()
{
	struct peo p1; //p1是局部的结构体变量
}

//结构体变量的初始化:定义变量的同时赋初值

struct peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int high;
}p3={"张三","18866669999","男",188};//初始化
struct peo p5={"张三","18866669999","男",188} ;//初始化

int main()
{
	struct peo p1 = {"张三","18866669999","男",188};//初始化
}
//嵌套结构体怎么初始化?

struct peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int high;
};
struct stu
{
	struct peo p;
	int num;
	float f;
};

int main()
{
	struct peo p1 = {"张三","18866669999","男",188};
	struct stu s = { {"李四","18866669999","女","168"},100,3.14f };
    //结构体嵌套初始化
}

2.结构体成员访问

  • 结构体变量访问成员

结构变量的成员通过( . )访问。

eg:

![屏幕截图 2024-11-24 114138](C:\Users\金思思\Pictures\Screenshots\屏幕截图 2024-11-24 114138.png)struct peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int high;
}p3,p4;
struct peo p5,p6 ;

struct stu
{
	struct peo p;
	int num;
	float f;
};

int main()
{
	struct peo p1 = {"张三","18866669999","男",188};
	struct stu s = { {"李四","18866669999","女","168"},100,3.14f };
	printf("%s %s %s %d\n", p1.name, p1.tele, p1.sex, p1.high);
	printf("%s %s %s %d %d %f\n", s.p.name, s.p.tele, s.p.sex, s.p.high,s.num,s.f);
    return 0;
}

结果:

屏幕截图 2024-11-24 114138.png

  • 结构体指针访问指向变量的成员

    有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。

eg:

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;
}

结果:

屏幕截图 2024-11-24 131609.png

3.结构体传参

代码如下:

//声明的结构体类型
#include<stdio.h>


struct peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int high;
};

struct stu
{
	struct peo p;
	int num;
	float f;
};
//结构体传参
void print1(struct peo p)
{
	printf("%s %s %s %d\n", p.name, p.tele, p.sex, p.high);
}
//结构体地址传参
void print2(struct peo* sp)
{
	printf("%s %s %s %d\n",sp->name,sp->tele,sp->sex,sp->high);
}
int main()
{
	struct peo p1 = {"张三","18866669999","男",188};
	struct stu s = { {"李四","18866669999","女","168"},100,3.14f};
	print1(p1);//传结构体
	print2(&p1);//传结构体地址
}

上面的 print1print2 函数哪个好些?

答案是:首选print2函数。

原因:

函数传参的时候,参数是需要压栈的。

如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的 下降。

结论:

结构体传参时,要传结构体的地址。