初阶C语言 - 结构体

目录

1. 结构体的声明 

1.1 结构的基础知识 

1.2 结构体类型的声明 

1.3 结构体成员的类型

1.4 结构体变量的创建和初始化

1.4.1 结构体变量的创建: 

1.4.2 结构体变量的初始化:

2. 结构体成员的访问

2.1 结构体变量访问结构体成员 

2.2 结构体指针访问结构体成员 

2.3 结构体成员的访问的总结

3. 结构体传参

1. 结构体的声明 

1.1 结构的基础知识 

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

结构是一种集合。结构中的每个成员可以是不同类型。

类比和区别:数组是一组相同类型元素的集合,放在数组中的所有元素类型是相同的。

目前我们已经学过一些类型 : 字符型(char),整型(short,int...),浮点型(float,double) ,这些类型是内置类型。

但是生活中总会有一些复杂对象,比如:人,人有姓名,性别,电话,身高等;再比如:书,书有书名,作者,定价,书号等,这些复杂对象无法用内置类型来描述。那么如何来描述这些复杂对象呢?于是就有了结构体的出现,结构体是一种用户定义的数据类型,即自定义类型,是用来描述复杂对象的。

1.2 结构体类型的声明 

初阶C语言 - 结构体_第1张图片 

struct:结构体关键字,它表明是个结构体,结构体的声明必须有struct。

结构体标签:它是你给你的结构体类型取的名字

struct 结构体标签:这表示一个结构体类型

成员列表:可以有多个成员,每个成员有各自的数据类型和成员变量名。

结构体变量列表:可以有多个变量,是使用结构体类型创建的变量,一般结构体变量列表省略不写,先先进行结构体声明,之后再创建结构体变量。

举一个结构体类型声明的例子:

初阶C语言 - 结构体_第2张图片

下面是有结构体变量列表的情况 

初阶C语言 - 结构体_第3张图片

1.3 结构体成员的类型

 结构体的成员可以是标量(int,float,double)、数组、指针,甚至是其他结构体(变量)。

 比如:

初阶C语言 - 结构体_第4张图片

1.4 结构体变量的创建和初始化

1.4.1 结构体变量的创建: 

创建局部变量p1: 

 初阶C语言 - 结构体_第5张图片

类型不占用内存,只有用类型创建变量后才占用内存。 

初阶C语言 - 结构体_第6张图片 

创建全局变量p2,p3: 

初阶C语言 - 结构体_第7张图片

1.4.2 结构体变量的初始化:

 初始化:创建变量的同时给变量赋值。

初阶C语言 - 结构体_第8张图片

 初阶C语言 - 结构体_第9张图片

2. 结构体成员的访问

结构体变量 . 结构体成员变量

结构体指针 -> 结构体成员变量

2.1 结构体变量访问结构体成员 

结构体变量通过点操作符(.)访问结构体成员。 

结构体变量 . 结构体成员变量

像这样: 

初阶C语言 - 结构体_第10张图片

举例1:

#include 

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

//声明的结构体类型是:struct S
struct S
{
	struct Peo p;
	int sum;
	float f;
};

int main()
{
	struct Peo p1 = { "张三","男","12366784567",183 };
	struct S s = { {"李四","男","12366784567",186},10,3.14f };

	printf("%s %s %s %d\n",p1.name,p1.sex,p1.tele,p1.high);
	printf("%s %s %s %d %d %f",s.p.name,s.p.sex,s.p.tele,s.p.high,s.sum,s.f);

	return 0;
}

初阶C语言 - 结构体_第11张图片

 举例2:结构体传参(传的是结构体变量)

 初阶C语言 - 结构体_第12张图片

代码如下: 

#include 

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

void print(struct Peo sp)//结构体类型的变量来接收
{
	printf("%s %s %s %d\n", sp.name, sp.sex, sp.tele, sp.high);

}

int main()
{
	struct Peo p1 = { "张三","男","12366784567",183 };
	print(p1);//传的是结构体类型的变量
	return 0;
}

初阶C语言 - 结构体_第13张图片 

 

2.2 结构体指针访问结构体成员 

结构体指针通过操作符(->)访问结构体成员。

结构体指针 -> 结构体成员变量

像这样:

初阶C语言 - 结构体_第14张图片

 举例:结构体传参(传的是结构体变量的地址)

#include 

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


void print(struct Peo* sp)//结构体类型的指针来接收
{
	printf("%s %s %s %d\n", sp->name, sp->sex, sp->tele, sp->high);
	
}

int main()
{
	struct Peo p1 = { "张三","男","12366784567",183 };
	print(&p1);//传的是结构体变量名的地址,结构体类型的地址

	return 0;
}

初阶C语言 - 结构体_第15张图片

2.3 结构体成员的访问的总结

结构体变量 . 结构体成员变量

结构体指针 -> 结构体成员变量

举例: 

初阶C语言 - 结构体_第16张图片

代码如下: 

#include 

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

//声明的结构体类型是:struct S
struct S
{
	struct Peo p;
	int sum;
	float f;
};

void print(struct Peo* sp,struct S* ss)//结构体类型的指针来接收
{
	printf("%s %s %s %d\n",sp->name,sp->sex,sp->tele,sp->high);
	//结构体指针->结构体成员变量:sp->name
	printf("%s %s %s %d %d %f\n",ss->p.name,ss->p.sex,ss->p.tele,ss->p.high,ss->sum,ss->f);
	//结构体指针->结构体成员变量:ss->p  结构体变量.结构体成员变量:p.name
}

int main()
{
	struct Peo p1 = { "张三","男","12366784567",183 };
	struct S s = { {"李四","男","12366784567",186},10,3.14f };

	print(&p1,&s);//传的是结构体变量名的地址,结构体类型的地址

	return 0;
}

 初阶C语言 - 结构体_第17张图片

3. 结构体传参

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

如果传的是结构体变量,形参是实参的一份临时拷贝,会造成大量内存空间的浪费。

如果传的是结构体的地址,形参接收到的是个指针,形参部分只要开辟一个指针变量的大小的内存空间,只需要4个字节或8个字节,减少空间的浪费。

你可能感兴趣的:(初阶C语言,c语言,c++)