浅谈结构体传参时的传值与传址

对于初学C语言的同学来说,结构体传参是一件值得我们考虑的问题,传参的时候我们会想,是传值好呢?还是传址好?

接下来我们讨论一下这个问题

举个例子:
我们首先先创建一个结构体

struct Stu
{
    
    
	char name[1000];
	int num;
	int age;
};

接下来我们创建一个结构体变量:

struct Stu s = {
    
     "zhangsan", 12345, 18 };

我们考虑打印出来结构体的成员,我们可以封装两个函数分别叫print1与print2
print1---------->用来传值打印
print2---------->用来传址打印

接下来我们实现这两个函数
print1

void print1(struct Stu ss)
{
    
    
	printf("%s %d %d\n", ss.name, ss.num, ss.age);
}

完整代码如下:

#include <stdio.h>

void print1(struct Stu ss)
{
    
    
	printf("%s %d %d\n", ss.name, ss.num, ss.age);
}
int main()
{
    
    
	struct Stu s = {
    
     "zhangsan", 12345, 18 };
	print1(s);//传值 打印结构体的数据
	return 0;
}

结果如下
在这里插入图片描述

接下来我们实现print2 通过传址调用此函数
print2

void print2(struct Stu* ps)
{
    
    
	printf("%s %d %d\n", ps->name, ps->num, ps->age);
}
int main()
{
    
    
	struct Stu s = {
    
     "zhangsan", 12345, 18 };
	print2(&s);//传址 打印结构体数据
	return 0;
}

结果如下 一模一样的结果
在这里插入图片描述
这是不禁出现了疑问,同样都能达到打印结构体数据的效果,那么是传值好还是传址好呢?

在传值时,形参是实参的一份临时拷贝,它会在栈区开辟一块新的空间,在结构体传参时,如果结构体过大,开辟空间也就随之增大,在空间与时间上来说,开销比较大。

传址时,地址在32位平台占4个字节,64位平台占8个字节,相对于结构体所占字节而言要少。
函数在传参时,参数需要压栈,如果传递的一个结构体过大,参数压栈的系统开销较大,导致性能下降。

综上所述 结构体传参时,应优先考虑传结构体的地址。

感谢观看。
完整代码如下:

struct Stu
{
    
    
	char name[1000];
	int num;
	int age;
};

#include <stdio.h>

void print1(struct Stu ss)
{
    
    
	printf("%s %d %d\n", ss.name, ss.num, ss.age);
}
void print2(struct Stu* ps)
{
    
    
	printf("%s %d %d\n", ps->name, ps->num, ps->age);
}
int main()
{
    
    
	struct Stu s = {
    
     "zhangsan", 12345, 18 };
	print1(s);//传值 打印结构体的数据
	print2(&s);//传址 打印结构体数据
	return 0;
}

猜你喜欢

转载自blog.csdn.net/JixTlhh/article/details/113773487