C语言 结构体

发布时间:2024年01月08日

C语言学习!

目录

前言

一、结构体是什么?

二、结构体的声明

三、结构体成员的类型

四、结构体变量的定义和初始化

4.1 结构体变量的定义(创建)

4.2 结构体变量的初始化

五、结构体成员的访问

5.1 结构体成员和 . 运算符

5.2 结构体成员和 ->?运算符

五、结构体传参

总结


前言

????????将多个数据的集合对应到程序中时,最好在将其聚合后再对应。结构体表示任意类型的数据的集合,最适合用来实现这种结构的数据。


一、结构体是什么?

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

辨析:

  • 结构多种类型的数据的集合。
  • 数组是一组相同类型元素的集合。

结构体应用:复杂对象的描述就会使用到结构体。

二、结构体的声明

语法结构:

struct tag
{

	member - list;//结构体成员

}variable - list;
  • struct 结构体关键字。
  • tag 结构体标签,也就是结构名。
  • member - list 结构体成员列表,实际程序中是多个成员。
  • variable - list 变量列表,可省略。

代码示例1:

#include <stdio.h>

struct Peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int hight;
};

int main()
{
	struct Peo p1;//结构体变量的创建
	return 0;
}

????????上述代码中:

struct Peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int hight;
};

这一块是数据类型的声明,并不定义变量的实体。

? ? ? ? 要保存名字、电话等数据,需要像代码示例中:

struct Peo p1;

声明和定义实体变量。struct Peo 是类型名,其中?Peo 只是结构名。意思是声明?struct Peo 型的变量 p1 。


代码示例2:

#include <stdio.h>

struct Peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int hight;
}p1,p2;

int main()
{

	return 0;
}

????????示例2中 p1、p2 是使用 struct Peo 结构类型创建的两个变量,是两个全局的结构体变量。


三、结构体成员的类型

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

代码示例:

#include <stdio.h>

struct Peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int hight;
};

struct St
{
	struct Peo p1;
	int* pi;
	char arr[5];
	double a;
};

int main()
{
	struct St s1;//结构体变量的创建
	return 0;
}

四、结构体变量的定义和初始化

4.1 结构体变量的定义(创建)

代码示例:

#include <stdio.h>

struct Peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int hight;
}p2, p3;

struct Peo p4, p5;

int main()
{
	struct Peo p1;
	return 0;
}

? ? ? ? 代码中p1、p2、p3、p4、p5都是创建的结构体变量,其中p1是局部变量,p2、p3、p4、p5是全局变量。

4.2 结构体变量的初始化

代码示例:

#include <stdio.h>

struct Peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int hight;
};

int main()
{
	struct Peo p1 = { "小明","18833339999","男",183 };
	struct Peo p2 = { "小梅","15566668888","女",165 };
	return 0;
}

监视窗口:


????????当结构体的变量类型中有结构体如何初始化。

代码示例:

#include <stdio.h>

struct Peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int hight;
};

struct St
{
	struct Peo p;
	int* pi;
	char arr[5];
	double a;
};

int main()
{
	int i = 0;
	struct Peo p1 = { "小明","18833339999","男",183 };
	struct St s2 = { { "小梅","15566668888","女",165 },&i,{1,2,3,4,5},3.14 };
	return 0;
}

监视窗口:


五、结构体成员的访问

5.1 结构体成员和 . 运算符

????????结构体变量访问成员:结构变量的成员是通过点运算符(.)访问的。点操作符接受两个操作数。

运算符(.)? ? a.b? ? ? 表示结构体a的成员b

代码示例:

#include <stdio.h>

struct Peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int hight;
};

struct St
{
	struct Peo p;
	int* pi;
	char arr[5];
	double a;
};

int main()
{
	int i = 0;
	struct Peo p1 = { "小明","18833339999","男",183 };
	struct St s2 = { { "小梅","15566668888","女",165 },&i,{1,2,3,4,5},3.14 };

	printf("%s,%s,%s,%d\n", p1.name, p1.tele, p1.sex, p1.hight);
	printf("%s,%s,%s,%d,%p,{ %d %d %d %d %d },%f\n", s2.p.name, s2.p.tele, s2.p.sex, s2.p.hight, s2.pi, s2.arr[0], s2.arr[1], s2.arr[2], s2.arr[3], s2.arr[4], s2.a);

	return 0;
}

运行结果:

小明,18833339999,男,183
小梅,15566668888,女,165,0095FED8,{ 1 2 3 4 5 },3.140000

5.2 结构体成员和 ->?运算符

????????结构体指针访问指向变量的成员:指向一个结构体的指针访问成员是通过箭头运算符(->)访问的。

->?运算符? ? ? a->b? ? ? 用指针访问结构体a中的成员b

代码示例:

#include <stdio.h>

struct Peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int hight;
};

void print1(struct Peo p)
{
	printf("%s,%s,%s,%d\n", p.name, p.tele, p.sex, p.hight);//结构体变量.成员变量
}

void print2(struct Peo* p)
{
	printf("%s,%s,%s,%d\n", (*p).name, (*p).tele, (*p).sex, (*p).hight);
	printf("%s,%s,%s,%d\n", p->name, p->tele, p->sex, p->hight);//结构体指针->成员变量
}

int main()
{
	struct Peo p1 = { "小明","18833339999","男",183 };
	struct Peo p2 = { "小梅","15566668888","女",165 };
	print1(p1);
	print2(&p2);
	return 0;
}

运行结果:

小明,18833339999,男,183
小梅,15566668888,女,165
小梅,15566668888,女,165

? ? ? ? print2 函数传递的是地址,将指针作为参数的接收,因此形参 p 就是指向 Peo 结构体的指针类型。

???????? print2 函数的形参 p 接受的是指向结构体对象 p2 的指针,在指针变量前加上指针运算符 * 就表示该指针指向的对象实体,即 *p 是 p2 的别名,所以通过?(*p).name 可以表示 p 指向的对象的成员。

????????(*p).name 和 p->name 是等价的。

五、结构体传参

? ? ? ? 5.2?中的代码 print1 函数和 print2 函数都进行了函数传参,这两个函数中首选 print2 函数的传参方式,因为若结构体过大传递地址比传递结构体对象更节省空间。

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


总结

????????以上就是今天要讲的内容,本文仅仅简单介绍了结构体。

文章来源:https://blog.csdn.net/Echo_cy_/article/details/135448536
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。