*****结构体的嵌套使用 结构体成员作为函数的参数(三种方法和使用最多的地址传递)

向函数传递结构体的方式有三种:

1、向函数传递结构体的单个成员:结构体的单个成员作为函数参数,相当于变量在函数之间的传递,仅仅复制单个成员的内容。(很少使用)。

2、用结构体变量作为函数参数,向函数传递结构的完整结构:实际是复制所有结构体成员给函数。调用函数的结果不影响主调函数的结构体成员的值。传递后的值不能改变结构体原始值。

        用结构体变量作实参时,采取的是“值传递”方式,将结构体变量所占的内存单元的内容(结构体变量成员列表)全部顺序传递给形参,这里形参也得是结构体变量。

C语言允许对具有相同类型的结构体变量进行整体赋值,在赋值的时候是按照成员变量逐一的进行赋值。

#include <stdio.h>

typedef struct max   //定义一个标签为max的结构体
{
	int x;
	int y;
	int z;
}max;


int func(max s)   //最大值函数,三目运算符,形参为max类型的s
{
	s.z = s.x > s.y ? s.x:s.y;
	return s.z;
}

int main()
{
	max s = {0, 0 ,0};  //给结构体变量s赋值
	s.x= 1;              //修改结构体变量s中的成员x变量的值
	
	printf("%d = %d > %d ? %d : %d ",func(s),s.x,s.y,s.x,s.y);
	
	//输出结果 1 = 1 > 0 ? 1:0
}

 

3、向函数传递结构体变量的首地址:用结构体指针或结构体数组作为函数参数向函数传值,仅仅复制一个地址值。传递后的值可以改变结构体原始值。

当然这里的a -> y = 13;等价于(*a).y =13; 

 

 很多人分为这三种,但其实还有一种,就是用结构体变量的引用变量作函数参数,(很少提到,但最好用)

这种传递方式:实参是结构体变量,形参是对应的结构体变量的引用,传递的是地址,因而执行效率与指针差不多一样高。而且更加直观明了,使程序更加简单易懂。

被调函数参数写为接收地址的形参

#include <stdio.h>


typedef struct max
{
	int x;
	int y;
	int z;
}max;


int func(max &a)	//看这里,接收结构体变量的地址即可,使用起来和原函数很像
{
	a.z = 14;	
}

int main()
{
	max s = {0, 0 ,0};
	printf("%d %d %d\n",s.x,s.y,s.z);
	
	func(s);                 //直接传递结构体变量
	printf("%d %d %d",s.x,s.y,s.z);
	
}

因为嵌套使用和前面的结构体成员的访问有关,所以放在了最后: 

#include <stdio.h>
#include <string.h>

//日程管理 

typedef struct date  //定义了一个日期结构体,包含年月日三个成员 
{
	int year;
	int mouth;
	int day;
}datea;

typedef struct  schedule//定义了一个日程结构体,包含日期,和活动两个成员变量 
{
	datea date;
	char activity[200];
}sch;



int main()
{
	sch jack;                   //jack的日程
	jack.date.year = 2021;      //使用级联运算 
	jack.date.mouth = 11;
	jack.date.day = 11;
	strcpy(jack.activity,"Taobao shooping");  //字符串的赋值要使用strcpy
	
	printf("%d %d %d \n%s \n",jack.date.year,jack.date.mouth,jack.date.day,jack.activity);
	
	
	
}

输出结果: 

 函数调用的情况:

#include <stdio.h>
#include <string.h>

typedef struct date  //定义了一个日期结构体,包含年月日三个成员 
{
	int year;
	int mouth;
	int day;
}datea;

typedef struct  schedule//定义了一个日程结构体,包含日期,和活动两个成员变量 
{
	datea date;
	char activity[200];
}sch;

int Init(sch &jack)  //初始化函数 
{
	jack.date.year = 2021; //使用级联运算 
	jack.date.mouth = 11;
	jack.date.day = 11;
	strcpy(jack.activity,"Taobao shooping");
 } 


int main()
{
	sch jack;
	
	Init(jack);
	
	printf("%d %d %d \n%s \n",jack.date.year,jack.date.mouth,jack.date.day,jack.activity);
	
	
	
}

 

 那么最后我们把数组和函数调用结合起来,写一个2个人的日程管理情况,(这里用到结构体数组做函数参数的传递,结构体数组的赋值和访问,结构体嵌套的使用)

#include <stdio.h>
#include <string.h>

typedef struct date  //定义了一个日期结构体,包含年月日三个成员 
{
	int year;
	int mouth;
	int day;
}datea;

typedef struct  schedule//定义了一个日程结构体,包含日期,和活动两个成员变量 
{
	char name[10];
	datea date;
	char activity[200];
}sch;

int Init(sch *name)  //初始化函数 数组用指针接收 
{
	strcpy(name[0].name,"jack");
	name[0].date.year = 2021; //使用级联运算 
	name[0].date.mouth = 11;
	name[0].date.day = 11;
	strcpy(name[0].activity,"Taobao shooping");
	

	
	strcpy(name[1].name,"Amy");
	name[1].date.year=2021;
	name[1].date.mouth = 11;
	name[1].date.day = 12;
	strcpy(name[1].activity,"play piano");
 } 


int main()
{
	sch name[2];
	for(int i=0;i<2;i++)
	{
		Init(name);
	
		printf("%s %d %d %d \n%s \n",name[i].name,name[i].date.year,name[i].date.mouth,name[i].date.day,name[i].activity);		
	}
	
}

输出结果:        

 

 

如果你看到这里,给个赞吧,很认真编辑了的。

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
当我们需要在函数中操作结构体类型的数据时,可以将结构体类型作为函数的形参,这样在函数内部就可以对结构体类型数据进行操作。 如果结构体嵌套了其他结构体,我们可以将嵌套结构体类型作为结构体类型的成员之一,并在函数参数传递结构体类型。 例如,定义一个名为 `Student` 的结构体类型,其中嵌套了一个名为 `Birthday` 的结构体类型,代码如下: ```c #include <stdio.h> struct Birthday { int year; int month; int day; }; struct Student { char name[20]; int age; struct Birthday birthday; }; void printStudent(struct Student stu) { printf("Name: %s\n", stu.name); printf("Age: %d\n", stu.age); printf("Birthday: %d-%02d-%02d\n", stu.birthday.year, stu.birthday.month, stu.birthday.day); } int main() { struct Student stu = {"Tom", 18, {2000, 1, 1}}; printStudent(stu); return 0; } ``` 在上面的示例中,我们定义了一个名为 `Birthday` 的结构体类型和一个名为 `Student` 的结构体类型,`Student` 结构体嵌套了 `Birthday` 结构体类型。在 `printStudent` 函数中,我们将 `Student` 结构体类型作为参数传递,可以直接通过 `stu.birthday` 访问嵌套的 `Birthday` 结构体类型的成员变量。 当然,我们也可以将 `Student` 结构体类型的指针作为函数参数,代码如下: ```c void printStudent(struct Student *pStu) { printf("Name: %s\n", pStu->name); printf("Age: %d\n", pStu->age); printf("Birthday: %d-%02d-%02d\n", pStu->birthday.year, pStu->birthday.month, pStu->birthday.day); } int main() { struct Student stu = {"Tom", 18, {2000, 1, 1}}; printStudent(&stu); return 0; } ``` 注意,在函数中访问结构体类型的成员变量时,可以使用 `.` 运算符或 `->` 运算符,前者用于结构体类型变量,后者用于结构体类型指针。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程图一乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值